Что нового

[Календарь] Определение дня недели по дате

damien2008

Осваивающий
Сообщения
178
Репутация
34
AutoIt: 3.3.8.1
Версия: 1.0
Лицензия:
Категория: Строки, Математика, Разное

Описание: собственно сабж. может кому пригодится. вариантов в интернете много, вот более-менее рабочий. 8)
по формуле Зеллера

Код/Пример:
Код:
#cs ------------------------------------------------------------------------
	Версия AutoIt:	3.3.8.1
	Автор:			damien2008
	Описание:		алгоритм определения дня недели по дате
#ce ------------------------------------------------------------------------

; Код программы

#include <Array.au3>

Dim $ArrDay[8] =['Пон', 'Вто', 'Сре', 'Чет', 'Пят', 'Суб', 'Вос']
Dim $date = StringSplit('29/03/2000', '/')

main()

Func main()
	If $date[2] <= 2 Then
		$date[1] += 3
		$date[3] -= 1
	EndIf

	Local $w = Int(Mod(($date[1] + $date[3] + Int($date[3] / 4) - Int($date[3] / 100) + Int($date[3] / 400) + Int((31 * $date[2] + 10) / 12)), 7))

	MsgBox(0, '', 'день недели - ' & $ArrDay[$w])
	;ConsoleWrite($ArrDay[$w] & @CRLF)
EndFunc

История версий:
1.0

Источник: autoit-script.ru
Автор(ы): damien2008
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Уже есть функции для этого, вот пример с небольшой корректировкой, для русского языка:

Код:
#include <Date.au3>

Dim $aDate = StringSplit('09/06/2013', '/')

$sDay = _DateDayOfWeekEx(_DateToDayOfWeek($aDate[3], $aDate[2], $aDate[1]), 0)
ConsoleWrite($sDay & @LF)

Func _DateDayOfWeekEx($iDayNum, $iShort = 0)
	Local Const $aDayOfWeek[8] = ["", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
	Local Const $aDayOfWeek_Rus[8] = ["", "Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"]
	
	Select
		Case Not StringIsInt($iDayNum) Or Not StringIsInt($iShort) Or $iDayNum < 1 Or $iDayNum > 7
			Return SetError(1, 0, "")
		Case Else
			Local $sRet = $aDayOfWeek[$iDayNum]
			If @OSLang = 0419 Then $sRet = $aDayOfWeek_Rus[$iDayNum]
			
			If $iShort Then
				$sRet = StringLeft($sRet, 3)
			EndIf
			
			Return $sRet
	EndSelect
EndFunc
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
178
Репутация
34
CreatoR
спасибо. не знал. только что посмотрел. сложновато как-то у них в UDF реализовано, хотя алгоритм вроде тот-же, намудрено как-то.
и с фактором что-то накрутили.
там они предлагают использовать 2 функции _DateToDayOfWeek и _DateDayOfWeek.
все-равно спасибо)
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
CreatoR
У Вас опечатка в слове "Пятница"
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот так адаптировал с привязкой к системе:

Код:
#include <Date.au3>

Dim $aDate = StringSplit('10/06/2013', '/')

$iDay = _DateToDayOfWeek($aDate[3], $aDate[2], $aDate[1])

$sDay = _DateDayOfWeekEx($iDay, 0)
$sDay_Short = _DateDayOfWeekEx($iDay, 1)

ConsoleWrite($sDay & ' [' & $sDay_Short & ']' & @LF)

Func _DateDayOfWeekEx($iDayNum, $iShort = 0, $iLCID = @OSLang)
	If Not IsInt($iDayNum) Or $iDayNum < 1 Or $iDayNum > 7 Then
		Return SetError(1, 0, '')
	EndIf
	
	If Not IsInt($iShort) Or $iShort < 0 Or $iShort > 1 Then
		$iShort = 0
	EndIf
	
	Local $iIndex = Mod($iDayNum + 5, 7) + 42 + $iShort * 7
	Local $aRet = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', Dec($iLCID), 'dword', $iIndex, 'wstr', '', 'int', 2048)
	
	Return $aRet[3]
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Поразительно, но я уже писал подобную функцию :laugh:, довольно схожа с этой, странно что я про это забыл.
 
Верх