Что нового

[Время, дата] Преобразовать время (DOS или UTC) в строку

erlik

Продвинутый
Сообщения
317
Репутация
84
Подскажите, пожалуйста, как мне из этого
Код:
0x480381e1 (или в dec - 1208189409)
получить вот это: 14.04.2008 16:10:09 ?
Увы, но пока тонкости форматов времени так и не асилил :stars: И справка по Date.au3 не помогла...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Откуда взято это значение?
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
CreatoR
Из данных PE Explorer о модуле user32.dll - параметр TimeDateStamp структуры IMAGE_FILE_HEADER.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
erlik
Не оно?
http://autoit-script.ru/index.php/topic,8539.msg57639.html#msg57639

Что-то такое:
Код:
#include "TimeStamp.au3"

$iTimeStamp = 0x480381e1
ConsoleWrite($iTimeStamp & @CRLF)
$sDateTime = _StringFormatTime("%d.%m.%Y %H:%M:%S", $iTimeStamp)
ConsoleWrite($sDateTime & @CRLF)
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
WSWR
Похоже да. Год и месяц преобразовывается точно. А на время видимо нужно делать поправку на 4 часа.
---------------------------------------------------
Тему пока не закрываю - может, кто еще захочет отписаться. Кроме того, было бы интересно узнать как пользоваться
Код:
_Date_Time_DOSDateToStr($iDosDate)
- по идее она должно как раз это и делать, только непонятно как туда добавлять смещение от 1980 года...

------------------------------------------------------------------------
В общем слегка изменил под себя функцию из
Код:
"TimeStamp.au3"
. Для того, чтобы время из TimeDateStamp точно соответствовало тому, что PE Explorer выдает - его нужно получать по Гринвичу.
Код:
;$sTimeZone='localtime' - получаем локальное время
;$sTimeZone='gmtime' - получаем время по Гринвичу (GM)

; вызываем вот так и получаем то что нам нужно.
_TimeDOS_ToString(0x480381e1, -1,'gmtime')

Func _TimeDOS_ToString($i_TimeStamp, $s_Format, $sTimeZone='localtime', $i_MaxLen = 255)
	Local $struct_Time, $ptr_Time, $av_Time, $av_StrfTime

	If Not IsNumber($i_TimeStamp) Then
		Return SetError(1,-1,'')
	EndIf

    If $s_Format = -1 Or $s_Format = '' Then
        $s_Format='%d/%m/%Y %H:%M:%S'
    EndIf

	$ptr_Time = DllCall('CrtDll.dll', 'ptr:cdecl', $sTimeZone, 'long*', $i_TimeStamp)
	If @error Then
		Return SetError(@error,-2,'')
	EndIf

	$av_StrfTime = DllCall('CrtDll.dll', 'int:cdecl', 'strftime', _
		'str', '', _
		'int', $i_MaxLen, _
		'str', $s_Format, _
		'ptr', $ptr_Time[0])

	If (@error) Or Not (IsArray($av_StrfTime)) Then
		Return SetError(@error,-3, '')
	EndIf

	Return $av_StrfTime[1]
EndFunc
 
Верх