Что нового

@HOUR в UTC

zergood

Новичок
Сообщения
24
Репутация
1
Как заставить @HOUR отображать не локальное а UTC время?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
zergood [?]
Как заставить @HOUR отображать не локальное а UTC время?
Никак.
@Hour отображает локальное время, этот макрос нельзя изменить.

Можно получить UTC время с онлайн сервиса:

Код:
MsgBox(0, '', _Get_UTC_Time())

Func _Get_UTC_Time()
	Local $sTimeSource = BinaryToString(InetRead('http://tycho.usno.navy.mil/cgi-bin/timer.pl'))
	Return StringRegExpReplace($sTimeSource, '(?si).*?
(.*?) UTC.*', '\1')
EndFunc
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Ну вот еще вариант:
Код:
Global $SplitData

_Get_UTC_Time()

Func _Get_UTC_Time() ; Время из интернета (Московское)
   $URL = 'http://time100.ru/'
   $ReadHTML = BinaryToString(InetRead($URL), 4)
   $Data = StringRegExp($ReadHTML, '(\d+:\d+:\d+)', 3)
   $SplitData = StringSplit($Data[0], ':')
   MsgBox(0,"Информация",'Сейчас '&$SplitData[1]&':'&$SplitData[2]&':'&$SplitData[3]&' и всё работает')
EndFunc
 
Автор
Z

zergood

Новичок
Сообщения
24
Репутация
1
Спасибо.
А можно ли так реализовать?
допустим
Код:
$label_1 = GUICtrlCreateLabel(StringFormat('%02d', @HOUR-4), 150, 160, 180, 30, 4096)

т.е. от своего локального я получил псевдо UTC, но он не будет корректным.
допустим время стукнуло час, он заминусит эти 4, и будет время -3 часа )
можно ли на основе этого сделать нормальный 24х часовой формат?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
zergood,
Можно так сделать.
Код:
ConsoleWrite(_UTC_HOUR() & @LF)

Func _UTC_HOUR()
	Local $t_ST = DllStructCreate('word[8]')

	DllCall('kernel32.dll', 'none', 'GetSystemTime', 'struct*', $t_ST)
	If @error Then Return -1
	Return StringFormat('%02d', DllStructGetData($t_ST, 1, 5))
EndFunc   ;==>_UTC_HOUR
 
Автор
Z

zergood

Новичок
Сообщения
24
Репутация
1
madmasles сказал(а):
zergood,
Можно так сделать.
Код:
ConsoleWrite(_UTC_HOUR() & @LF)

Func _UTC_HOUR()
	Local $t_ST = DllStructCreate('word[8]')

	DllCall('kernel32.dll', 'none', 'GetSystemTime', 'struct*', $t_ST)
	If @error Then Return -1
	Return StringFormat('%02d', DllStructGetData($t_ST, 1, 5))
EndFunc   ;==>_UTC_HOUR
Не, это что-то не то
Нужно что-бы после 00, тот выставленный "-4" не минусовал так - когда локальное время стало 00 часов, нужно что-бы было 20 часов, вместо -04 (и всё это на основе @HOUR) Вообщем некий gmt offset )
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
zergood [?]
Код:
Local $iOffSet = -4, $HOUR = @HOUR + $iOffSet

If $HOUR < 0 Then $HOUR = BitAND($HOUR, 23)
ConsoleWrite(StringFormat('%02d (local hour)\t%02d (UTC hour)\n', @HOUR, $HOUR))
Результат будет абсолютно такой же, как в моем предыдущем посте.


Добавлено:
Сообщение автоматически объединено:

zergood,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 
Автор
Z

zergood

Новичок
Сообщения
24
Репутация
1
madmasles сказал(а):
zergood [?]
Код:
$iOffSet = -4
ConsoleWrite(StringFormat('%02d', BitAND(@HOUR + $iOffSet, 23)) & @LF)
Результат будет абсолютно такой же, как в моем предыдущем посте.
Не минусует почему-то. И час стал 1 значным. вместо 03 прописывается 3
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Мой вариант:
Код:
ConsoleWrite(_GetUTCHours() & @CRLF)

Func _GetUTCHours()
	Local $ret
	Local $oSC = ObjCreate("ScriptControl")
	If Not IsObj($oSC) Then Return SetError(1, 0, 0)
	$oSC.Language = "JavaScript"

	$ret = $oSC.Eval("new Date().getUTCHours()")
	Return $ret
EndFunc   ;==>_GetUTCHours

P.S. У меня работает.

Таким образом можно получить не только час, но всё то что есть в объекте date javascript :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Смещение относительно UTC можно так получить.
Код:
Local $HOUR, $iOffSet

$iOffSet = _Get_OffSet_HOUR_UTC()
ConsoleWrite('OffSet UTC = ' & $iOffSet & @LF)

For $i = 0 To 23
	$HOUR = $i + $iOffSet
	If $HOUR < 0 Then $HOUR = BitAND($HOUR, 23)
	ConsoleWrite(StringFormat('%02d (local hour)\t%02d (UTC hour)\n', $i, $HOUR))
Next

Func _Get_OffSet_HOUR_UTC()
	Local $t_TZ, $a_Res

	$t_TZ = DllStructCreate('long;byte[168]')
	$a_Res = DllCall('kernel32.dll', 'dword', 'GetTimeZoneInformation', 'struct*', $t_TZ)
	If (@error) Or ($a_Res[0] = -1) Then Return SetError(1, 0, '')
	Return Int(DllStructGetData($t_TZ, 1) / 60)
EndFunc   ;==>_Get_OffSet_HOUR_UTC



Добавлено:
Сообщение автоматически объединено:

alex33,
А StringFormat() на выходе? :smile:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
madmasles [?]
А StringFormat() на выходе?

А я забыл про него :smile: :smile:
Код:
ConsoleWrite(_GetUTCHours() & @CRLF)

Func _GetUTCHours()
    Local $ret
    Local $oSC = ObjCreate("ScriptControl")
    If Not IsObj($oSC) Then Return SetError(1, 0, 0)
    $oSC.Language = "JavaScript"

    $ret = $oSC.Eval("new Date().getUTCHours()")
    $ret = StringFormat("%02d", $ret)
    Return $ret
EndFunc   ;==>_GetUTCHours
 
Автор
Z

zergood

Новичок
Сообщения
24
Репутация
1
Оп, извиняюсь, действительно работает. Я скобку не поставил )
Круто. Спасибо тебе!

когда гуглил, еще такой вариант находил
Код:
$hour=@HOUR + GMTdiff()
    If $hour > 23 Then
        $hour -= 24
    ElseIf $hour < 0 Then
	$hour += 24
	endif
MsgBox(0,"GMT time", StringFormat("%02d:%02d:%02d", $hour, @MIN, @SEC) )

Func GMTdiff()
Local $TZI_struct = DllStructCreate("long;wchar[32];word;word;word;word;word;word;word;word;long;wchar[32];word;word;word;word;word;word;word;word;long")
Local $posun = DllCall(@SystemDir & "\kernel32.dll","int","GetTimeZoneInformation","ptr",DllStructGetPtr($TZI_struct))
Local $GMT=DllStructGetData($TZI_struct, 1)
If $posun[0]=2 Then $GMT+=DllStructGetData($TZI_struct, 21)
$TZI_struct = 1
Return Round($GMT/60)
EndFunc

правда изначально там стояло )
Код:
If $hour>24 Then $hour-=24


упс, заметил баг в
Код:
(StringFormat('%02d', BitAND(@HOUR + $iOffSet, 23)) & @LF)

Локальное время 13 часов, со сдвигом -4, он показывает 01
Локальное время 14 часов, со сдвигом -4, он показывает 02
Локальное время 10 часов, со сдвигом -2 он показывает 00
и т.д
это из-за чего так?
 
Верх