Что нового

Как получить разницу дат в миллисекундах

joker2d

Новичок
Сообщения
182
Репутация
0
Определяю дату создания файла
Код:
$t1 = FileGetTime($papka & $FileList[$i], 1, 1)


и мне надо определить сколько миллисекунд прошло после создания этого файла
нашел функцию _NowDate() но она возвращает дату в другом формате

подскажите как можно получить даты в одинаковых форматах и получить разницу в миллисекундах ?

PS В миллисекундах нужно потому что файл для которого смотрю дату это бекап который снимается постоянно после паузы в Sleep(43200000) и я хочу определять если файл бекапа намного старше чем 43200000 миллисекунд, значит была какая то ошибка в создании бекапа
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Наверно надо привести к одинаковому формату?
Код:
#include <Date.au3>

$d = StringRegExp(_DateTimeFormat( _NowCalc() ,0), "\d+", 3)
MsgBox(4096, "файл и текущее", FileGetTime('C:\этот_скрипт.au3', 0, 1) & @CR & StringFormat("%04d%02d%02d%02d%02d%02d", $d[2], $d[1], $d[0], $d[3], $d[4], $d[5]), 0)

Так как оба поддерживают возврат данных в массив, то можно сравнить умножив часы на 3600, минуты на 60 и т.д., потом сложить и будет время в секундах. Потом вычитание и получить разницу. Можно использовать _DateDiff_2()

Вот вариант, но я бы сделал на _DateDiff_2(), так как там используется високосный год и число дней в месяце и поэтому разница на границе месяцев не будет искажаться.
Код:
#include <Date.au3>

$d = StringRegExp(_DateTimeFormat( _NowCalc() ,0), "\d+", 3)
$d2 = FileGetTime('C:\этот_скрипт2.au3')

MsgBox(4096, "в секундах", ($d[2] * 31536000 + $d[1] * 2592000 + $d[0] * 86400 + $d[3] * 3600 + $d[4] * 60 + $d[5]) - ($d2[0] * 31536000 + $d2[1] * 2592000 + $d2[2] * 86400 + $d2[3] * 3600 + $d2[4] * 60 + $d2[5]), 0)
$s = ''
$s &= String($d[2]) & ' ' & String($d2[0]) & @CR
$s &= String($d[1]) & ' ' & String($d2[1]) & @CR
$s &= String($d[0]) & ' ' & String($d2[2]) & @CR
$s &= String($d[3]) & ' ' & String($d2[3]) & @CR
$s &= String($d[4]) & ' ' & String($d2[4]) & @CR
$s &= String($d[5]) & ' ' & String($d2[5])
MsgBox(4096, "по разрядам", $s, 0)


Либо искать WinAPI, который время файла переведёт в время в секунды от 1970 года.

Код:
#include <Date.au3>
#include <_DateDiff_2.au3>

$d = StringRegExp(_DateTimeFormat( _NowCalc() ,0), "\d+", 3)
$d2 = FileGetTime('C:\этот_скрипт3.au3')
$tmp = $d[2]
$d[2] = $d[0]
$d[0] = $tmp

$sCompare = _DateDiff_2($d2, $d, 0)
MsgBox(4096, "в секундах", $sCompare, 0)
 
Последнее редактирование:
Автор
J

joker2d

Новичок
Сообщения
182
Репутация
0
Использовал второй вариант все ок!
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
уточню: у вас по числу секунд критерий 12 часов, то есть каждые 12 часов бэкап. Теперь ситуация если бэкап 5-го числа, а дата 6 число в одно и то же время, то понятно надо делать бэкап, но если файл 28 февраля в 23:00, а текущее 1 марта 01:00, то есть разница в 2 часа, при этом скрипт определит, что по усреднённым значениям 30 дней в месяце промежуток между 28 и 1 марта будет 3 дня, или наоборот 31 числа в начале дня и 1-го числа в начале дня по усреднённым расчётам это будет одно и тоже время в секундах и бэкап делаться не будет, хотя прошло уже сутки. _DateDiff_2 избавляет от этой проблемы, так как вычисляет с учётом числа дней в месяце и високосного года.
У _DateDiff_2() придётся возвращаемые данные переделать, сейчас возвращается строка, а надо внутри функции вместо форматирования строки сделать умножение на число секунд и вывод будет сразу готовый в секундах.

даже переделывать не пришлось, просто вернул массив и подсчитал
Код:
#include <Date.au3>
#include <_DateDiff_2.au3>

$d = StringRegExp(_DateTimeFormat( _NowCalc() ,0), "\d+", 3)
$d2 = FileGetTime('C:\этот_скрипт3.au3')
$tmp = $d[2]
$d[2] = $d[0]
$d[0] = $tmp

$d = _DateDiff_2($d2, $d, 1)
MsgBox(4096, "в секундах", $d[0] * 31536000 + $d[1] * 2592000 + $d[2] * 86400 + $d[3] * 3600 + $d[4] * 60 + $d[5], 0)
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
А зачем? Это проблема только несоответствия форматов, и к параметрам функции никакого отношения не имеет. Сейчас вам это поможет, а другой чел будет плеваться от такого бреда, будет писать почему сравниваются 2 массива в одном из которых год в индексе 0, другой в индексе 2. Разряд года является старший и в функции сделано всё по старшинству разрядов. У англоязычных например месяц стоит первым, потом число, потом год, на всех не угодишь.
 

JohnWind

Новичок
Сообщения
58
Репутация
0
можно так попробовать...

Код:
;~ Get time
$curtime0 = _NowCalc()
;~ Get current time
$curtime = _NowCalc()

$DiffMillSec = _DateDiff( 's', $curtime0, $curtime)*1000
;~ Где $curtime0 - начальное время (в вашем случае создания файла); $curtime  - текущее время

MsgBox (0, 'Difference IS', $DiffMillSec)


Т.к. система в 99% НЕ будет хранить время создания файла с миллисекундами - можно округлять до секунд и умножить на 1000, для получения результата в миллисеках
К слову _NowCalc() имеет ограничение формата только до секунд.
 
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
122
Репутация
43
Т.к. система в 99% НЕ будет хранить время создания файла с миллисекундами - можно округлять до секунд и умножить на 1000, для получения результата в миллисеках
В файловой системе FAT не будет. А вот в NTFS ещё как будет. Собсс-но в WinAPI это всё прописано официально и «английским по белому»..
Вот-с, на любой вкус и цвет
 
Верх