Что нового

Названия дней недели и месяцев из локальных установок текущего пользователя

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
AutoIt: 3.3.6.1+
Версия: 1.0

Категория: Дата, время.

Описание: Получение названий дней недели и месяцев из локальных установок текущего пользователя всех (строкой или массивом) или по номеру.

Код/Пример:
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aWeek, $sWeek

$aWeek = _DateDayOfWeekLocalAll(False, True)
_ArrayDisplay($aWeek, '_DateDayOfWeekLocalAll(False, True)')

$aWeek = _DateDayOfWeekLocalAll(True, True)
_ArrayDisplay($aWeek, '_DateDayOfWeekLocalAll(True, True)')

$sWeek = _DateDayOfWeekLocalAll()
ConsoleWrite($sWeek & @LF)
ConsoleWrite('---' & @LF)

$sWeek = _DateDayOfWeekLocalAll(True, False, ' --> ')
ConsoleWrite($sWeek & @LF)
ConsoleWrite('---' & @LF)

For $i = 1 To 8
	$sWeek = _DateDayOfWeekLocal($i)
	If @error Then $sWeek = 'error ' & @error
	ConsoleWrite(StringFormat('number: %02d\tname: %s', $i, $sWeek) & @LF)
Next
ConsoleWrite('---' & @LF)

For $i = 1 To 8
	$sWeek = _DateDayOfWeekLocal($i, True)
	If @error Then $sWeek = 'error ' & @error
	ConsoleWrite(StringFormat('number: %02d\tname: %s', $i, $sWeek) & @LF)
Next

; #FUNCTION# ====================================================================================================
; Name...........: _DateDayOfWeekLocal
; Description....: Возвращает название дня недели, соответствующее указанному номеру дня (1-7) из локальных установок текущего пользователя.
; Syntax.........: _DateDayOfWeekLocal($i_NumDay, $f_Short)
; Parameters.....: $i_NumDay - номер дня недели от 1 до 7.
;                  $f_Short  - False (или 0) - полное название дня недели, True (или <> 0) - сокращенное.
;                  По умолчанию - False.
; Return values..: Success - полное или сокращенное название дня недели.
;                  Failure - пустая сторока и флаг @error:
;                            -1 - целая часть номера дня недели меньше 1 или больше 7;
;                             1 - ошибка DllCall().
; Author.........: madmasles
; Remarks........: Первый день недели берется из локальных установок текущего пользователя (например, для русского языка это понедельник,
;                  а для английского - воскресенье).
; Link...........: http://autoit-script.ru/index.php/
; Example........: Есть.
; ===============================================================================================================
Func _DateDayOfWeekLocal($i_NumDay, $f_Short = False)
	Local $a_Const[2] = [0x100C, 0x002A], $a_Res

	$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', 0x0400, 'dword', $a_Const[0], 'wstr', '', 'int', 2)
	If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
	$a_Const[0] = $a_Res[3]
	If $f_Short Then $a_Const[1] += 7
	$i_NumDay = Int($i_NumDay)
	Switch $i_NumDay
		Case 1 To 7
			$i_NumDay += $a_Const[0] - 1
			If $i_NumDay > 6 Then $i_NumDay -= 7
			$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', 0x0400, 'dword', $a_Const[1] + $i_NumDay, 'wstr', '', 'int', 80)
			If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
			Return $a_Res[3]
	EndSwitch
	Return SetError(-1, 0, '')
EndFunc   ;==>_DateDayOfWeekLocal

; #FUNCTION# ====================================================================================================
; Name...........: _DateDayOfWeekLocalAll
; Description....: Возвращает массив или строку с названиями всех дней недели из локальных установок текущего пользователя.
; Syntax.........: _DateDayOfWeekLocalAll($f_Short, $f_Array, $s_Delim)
; Parameters.....: $f_Short - False (или 0) - полные названия дней недели, True (или <> 0) - сокращенные. По умолчанию - False.
;                  $f_Array - False (или 0) - возвращается строка, True (или <> 0) - массив. По умолчанию - False.
;                  $s_Delim - разделитель (один или несколько символов). По умолчанию - '|'.
; Return values..: Success - строку или одномерный массив из 7 элементов с названиями всех дней недели.
;                  Failure - пустая сторока и флаг @error:
;                            1 - ошибка DllCall().
; Author.........: madmasles
; Remarks........: Первый день недели берется из локальных установок текущего пользователя (например, для русского языка это понедельник,
;                  а для английского - воскресенье).
; Link...........: http://autoit-script.ru/index.php/
; Example........: Есть
; ===============================================================================================================
Func _DateDayOfWeekLocalAll($f_Short = False, $f_Array = False, $s_Delim = '|')
	Local $a_Const[2] = [0x100C, 0x002A], $a_Res, $v_Ret

	$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', 0x0400, 'dword', $a_Const[0], 'wstr', '', 'int', 2)
	If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
	$a_Const[0] = $a_Res[3]
	If $f_Short Then $a_Const[1] += 7
	If Not $s_Delim Then $s_Delim = '|'
	For $i = 0 To 6
		$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', 0x0400, 'dword', $a_Const[1] + $a_Const[0], 'wstr', '', 'int', 80)
		If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
		$v_Ret &= $a_Res[3] & $s_Delim
		$a_Const[0] += 1
		If $a_Const[0] = 7 Then $a_Const[0] = 0
	Next
	$v_Ret = StringTrimRight($v_Ret, StringLen($s_Delim))
	If $f_Array Then $v_Ret = StringSplit($v_Ret, $s_Delim, 3)
	Return $v_Ret
EndFunc   ;==>_DateDayOfWeekLocalAll
Код:
#include <Array.au3>

Opt('MustDeclareVars', 1)

Global $aMonth, $sMonth

$aMonth = _DateDayOfMonthLocalAll(False, True)
_ArrayDisplay($aMonth, '_DateDayOfMonthLocalAll(False, True)')

$aMonth = _DateDayOfMonthLocalAll(True, True)
_ArrayDisplay($aMonth, '_DateDayOfMonthLocalAll(True, True)')

$sMonth = _DateDayOfMonthLocalAll()
ConsoleWrite($sMonth & @LF)
ConsoleWrite('---' & @LF)

$sMonth = _DateDayOfMonthLocalAll(True, False, ' --> ')
ConsoleWrite($sMonth & @LF)
ConsoleWrite('---' & @LF)

For $i = 0 To 13
	$sMonth = _DateDayOfMonthLocal($i)
	If @error Then $sMonth = 'error ' & @error
	ConsoleWrite(StringFormat('number: %02d\tname: %s', $i, $sMonth) & @LF)
Next
ConsoleWrite('---' & @LF)

For $i = 0 To 13
	$sMonth = _DateDayOfMonthLocal($i, True)
	If @error Then $sMonth = 'error ' & @error
	ConsoleWrite(StringFormat('number: %02d\tname: %s', $i, $sMonth) & @LF)
Next

; #FUNCTION# ====================================================================================================
; Name...........: _DateDayOfMonthLocal
; Description....: Возвращает название месяца, соответствующее указанному номеру (1-12(13)) из локальных установок текущего пользователя.
; Syntax.........: _DateDayOfMonthLocal($i_NumMonth, $f_Short)
; Parameters.....: $i_NumMonth - номер месяца от 1 до 12(13).
;                  $f_Short  - False (или 0) - полное название месяца, True (или <> 0) - сокращенное.
;                              По умолчанию - False.
; Return values..: Success - полное или сокращенное название месяца.
;                  Failure - пустая сторока и флаг @error:
;                            -1 - целая часть номера месяца меньше 1 или больше 12(13);
;                             1 - ошибка DllCall().
; Author.........: madmasles
; Remarks........: Тринадцатый месяц возвращается, если такой есть в локальных установках.
;                  http://msdn.microsoft.com/en-us/library/windows/desktop/dd373856(v=vs.85).aspx
; Link...........: http://autoit-script.ru/index.php/
; Example........: Есть.
; ===============================================================================================================
Func _DateDayOfMonthLocal($i_NumMonth, $f_Short = False)
	Local $a_Const[2] = [0x0038, 0x100E], $a_Res

	If $f_Short Then
		$a_Const[0] += 12
		$a_Const[1] += 1
	EndIf
	$i_NumMonth = Int($i_NumMonth)
	Switch $i_NumMonth
		Case 1 To 12
			$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', 0x0400, 'dword', $a_Const[0] + $i_NumMonth - 1, 'wstr', '', 'int', 80)
			If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
			Return $a_Res[3]
		Case 13
			$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', 0x0400, 'dword', $a_Const[1], 'wstr', '', 'int', 80)
			If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
			If $a_Res[3] Then Return $a_Res[3]
	EndSwitch
	Return SetError(-1, 0, '')
EndFunc   ;==>_DateDayOfMonthLocal

; #FUNCTION# ====================================================================================================
; Name...........: _DateDayOfMonthLocalAll
; Description....: Возвращает строку или массив с названиями всех месяцев из локальных установок текущего пользователя.
; Syntax.........: _DateDayOfMonthLocalAll($f_Short, $f_Array, $s_Delim)
; Parameters.....: $f_Short - False (или 0) - полные названия месяцев, True (или <> 0) - сокращенные. По умолчанию - False.
;                  $f_Array - False (или 0) - возвращается строка, True (или <> 0) - массив. По умолчанию - False.
;                  $s_Delim - разделитель (один или несколько символов). По умолчанию - '|'.
; Return values..: Success  - строку с названиями всех месяцев или одномерный массив из 12(13) элементов.
;                  Failure  - пустая сторока и флаг @error:
;                            1 - ошибка DllCall().
; Author.........: madmasles
; Remarks........: Тринадцатый месяц возвращается, если такой есть в локальных установках.
;                  http://msdn.microsoft.com/en-us/library/windows/desktop/dd373856(v=vs.85).aspx
; Link...........: http://autoit-script.ru/index.php/
; Example........: Есть
; ===============================================================================================================
Func _DateDayOfMonthLocalAll($f_Short = False, $f_Array = False, $s_Delim = '|')
	Local $a_Const[2] = [0x0038, 0x100E], $a_Res, $v_Ret

	If $f_Short Then
		$a_Const[0] += 12
		$a_Const[1] += 1
	EndIf
	If Not $s_Delim Then $s_Delim = '|'
	For $i = 0 To 11
		$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', 0x0400, 'dword', $a_Const[0] + $i, 'wstr', '', 'int', 80)
		If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
		$v_Ret &= $a_Res[3] & $s_Delim
	Next
	$a_Res = DllCall('kernel32.dll', 'int', 'GetLocaleInfoW', 'ulong', 0x0400, 'dword', $a_Const[1], 'wstr', '', 'int', 80)
	If @error Or Not $a_Res[0] Then Return SetError(1, 0, '')
	If $a_Res[3] Then $v_Ret &= $a_Res[3] & $s_Delim
	$v_Ret = StringTrimRight($v_Ret, StringLen($s_Delim))
	If $f_Array Then $v_Ret = StringSplit($v_Ret, $s_Delim, 3)
	Return $v_Ret
EndFunc   ;==>_DateDayOfMonthLocalAll

Источник: autoit-script.ru
Автор: madmasles
 
Верх