Что нового

[Время, дата] Преобразовать текстовое представление даты в метку времени Unix

WR-e-D

Новичок
Сообщения
53
Репутация
3
Например в пхп:
Код:
<?php
$time = strtotime('1st January 2004'); //1072915200
$timenow = strtotime("now");
echo $time."
";
echo $timenow."
";
echo date("d-m-Y", $time)."
";
echo date("d-m-Y [G:i:s]", $timenow)."
";
?>
Выведит следующее:
1072915200 ; 1st January 2004
1327779066 ; Сегодняшняя дата
01-01-2004
28-01-2012 [19:31:06]

Как реализовать подобное в autoit?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Использование:
Код:
#include "TimeStamp.au3"

$iTimeStamp = _TimeGetStamp()
ConsoleWrite($iTimeStamp & @CRLF)
$sDateTime = _StringFormatTime("%d.%m.%y %H:%M", $iTimeStamp)
ConsoleWrite($sDateTime & @CRLF)


UDF в аттаче
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
CreatoR [?]
Так оно вроде не конвертирует указанную дату
Конвертирует. Только предварительно все придется отделить друг от друга.
Смотреть функцию _TimeMakeStamp()


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

Код:
ConsoleWrite(_TimeMakeStamp(20,32,7,12,10,2010)& @CRLF) ; 12 октября 2010 года 07:32:20
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Medic84 [?]
Конвертирует. Только предварительно все придется отделить друг от друга.
Так в этом то и был вопрос (если я правильно понял), как это сделать по аналогу в php (strtotime).
Чтобы отделить нужно строить обработчик.
 
Автор
WR-e-D

WR-e-D

Новичок
Сообщения
53
Репутация
3
МНе лично нужно было вносить в бд время изменения таблицы - с чем это функция прекрассно справилась - еще раз спасибо )
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
cosmos [?]
Не вижу UDF TimeStamp.au3, как скачать его?
Ну Вы и откопали, тему конечно.
UDF уже устаревшая, она 2005 года была. На новых версиях неизвестно, заведется ли. Да и самой UDF уже нигде не найти, да и у меня не осталось.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Прикрепил.
Но сразу скажу, что время может выдавать неверное, у меня к примеру часы заданы на 01:03, а показывает 02:03 (локальное время).
 

Вложения

  • TimeStamp.au3
    8.1 КБ · Просмотры: 51

cosmos

Новичок
Сообщения
37
Репутация
0
CreatoR сказал(а):
Прикрепил.
Но сразу скажу, что время может выдавать неверное, у меня к примеру часы заданы на 01:03, а показывает 02:03 (локальное время).


Спасибо!
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Я обычно через объект SCRIPTCONTROL это всё делаю. Вот например:
Код:
Func __GMT_DateConvert($__sStr = "")
	Local $__sCode, $__sValidDateStr, $__oSC, $__iResult
	If StringRegExp($__sStr, '[\r\n\t"''\\\[\]\{\}]') Then Return SetError(1, 0, 0)
	If $__sStr Then
		$__sValidDateStr = StringRegExpReplace($__sStr, "(?i)^([a-z]{3}), (\d{2})-([a-z]{3})-(\d{4}) (\d{2}):(\d{2}):(\d{2}) gmt$", "$1 $3 $2 $4 $5:$6:$7")
		$__sCode = 'new Date("' & $__sValidDateStr & '").getTime()/1000;'
	Else
		$__sCode = 'new Date(new Date()).getTime()/1000;'
	EndIf
	$__oSC = ObjCreate("ScriptControl")
	If Not IsObj($__oSC) Then Return SetError(1)
	$__oSC.Language = "JavaScript"
	$__iResult = $__oSC.Eval($__sCode)
	If Not StringIsDigit($__iResult) Then Return SetError(2, 0, 0)
	Return $__iResult
EndFunc   ;==>__GMT_DateConvert
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В Windows есть похожая "метка" - FILETIME - количество 100-наносекундных интервалов, прошедших с 1 января 1601 года. Для FILETIME в Windows есть все необходимые функции для конвертации. В UNIX "метка" представляет собой количество секунд, прошедших с 1 января 1970 года. Сопоставив первое со вторым, получаем следующий код:

Код:
#Include <StructureConstants.au3>

Global $Year = 2004
Global $Month = 1
Global $Day = 1
Global $Hour = 0
Global $Minute = 0
Global $Second = 0

$tFT1 = DllStructCreate('uint64 TimeStamp')
$tST1 = DllStructCreate($tagSYSTEMTIME)
$tST1.Year = $Year
$tST1.Month = $Month
$tST1.Day = $Day

$tFT2 = DllStructCreate('uint64 TimeStamp')
$tST2 = DllStructCreate($tagSYSTEMTIME)
$tST2.Year = 1970
$tST2.Month = 1
$tST2.Day = 1

DllCall('kernel32.dll', 'bool', 'SystemTimeToFileTime', 'ptr', DllStructGetPtr($tST1), 'ptr', DllStructGetPtr($tFT1))
DllCall('kernel32.dll', 'bool', 'SystemTimeToFileTime', 'ptr', DllStructGetPtr($tST2), 'ptr', DllStructGetPtr($tFT2))

$TimeStamp = Floor(($tFT1.TimeStamp - $tFT2.TimeStamp) / 10000000)

ConsoleWrite($TimeStamp & @CRLF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied,
Я немного по-другому делал.
Код:
Local $t_ST, $a_Res, $t_FT

$t_ST = DllStructCreate('word[8]');$tagSYSTEMTIME
$a_Res = DllCall('kernel32.dll', 'int', 'GetSystemTime', 'struct*', $t_ST)
If @error Or (Not $a_Res[0]) Then Exit 1 ;Return SetError(1, 0, -1)
$t_FT = DllStructCreate('uint64')
$a_Res = DllCall('kernel32.dll', 'int', 'SystemTimeToFileTime', 'struct*', $t_ST, 'struct*', $t_FT)
If @error Or (Not $a_Res[0]) Then Exit 2 ;Return SetError(2, 0, -1)
ConsoleWrite(Int(DllStructGetData($t_FT, 1) / 10000000) - 11644473600 & @LF)

Еще так можно сделать.
Код:
#include <Date.au3>

ConsoleWrite(_DateDiff('s', '1970/01/01 00:00:00', _NowCalc()) & @LF)
 
Верх