Что нового

Время, дата Сравнение даты-времени

has

Новичок
Сообщения
4
Репутация
0
Подскажите: как в AutoIT сравнивать даты-время?
Казалось бы простая задача:
есть две даты-времени в стандартном представлении "ДД.ММ.ГГГГ чч:мм:сс" и нужно их сравнить.
Но в AutoIT нет типа дат, а для сравнения даты-времени в виде строки нужна либо специальная функция, либо функция конвертации в индексное представление даты.
На несколько раз прошелся по хелпу, нигде не смог найти ни функции сравнения, ни, хотя бы, функции конвертации во внутренний формат AutoIT:
"ГГГГ/ММ/ДД чч:мм:сс".
Может быть я что-то проглядел? Подскажите, пожалуйста.
P.S. Понятно, что можно написать свою функцию сравнения с разбором строк, и в инете таких примеров куча.
Но это же ненормально: каждый раз писать такую функцию.
Работа с датами - очень распространенная операция, и в любом языке должны быть встроенные инструменты.
Вот только в AutoIT не могу найти...
 

lettterssino

Знающий
Сообщения
109
Репутация
10
Не очень понятно, с какой целью вы хотите сравнивать даты и время и какой итог ожидаете
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Но это же ненормально: каждый раз писать такую функцию.
А кто когда пишет одну функцию каждый раз? Это и в самом деле ненормально.
Работа с датами - очень распространенная операция, и в любом языке должны быть встроенные инструменты.
Но не под каждый же формат, который кто-то в мире считает стандартным.
даты-времени в стандартном представлении "ДД.ММ.ГГГГ чч:мм:сс"
ни, хотя бы, функции конвертации во внутренний формат AutoIT:
"ГГГГ/ММ/ДД чч:мм:сс".
И было бы в этом хоть что-нибудь сложное, даже без функций можно обойтись, если пару раз в скрипте фигурирует.
Код:
$sStandardAutoItTime = StringMid($s, 7, 4) & "/" & StringMid($s, 3, 2) & "/" & StringMid($s, 1, 2) & " " & StringMid($s, 12, 8) ; $s is a time in the format I consider as the standard one.
Любители регулярных выражений такое записывают даже короче, но вряд ли оптимальнее для выполнения.
Сообщение автоматически объединено:

Не очень понятно, с какой целью вы хотите сравнивать даты и время и какой итог ожидаете
Сравнение_(программирование)
 
Последнее редактирование:
Автор
has

has

Новичок
Сообщения
4
Репутация
0
А кто когда пишет одну функцию каждый раз? Это и в самом деле ненормально.
Вот и я об этом - должна быть встроенная функция.
Но не под каждый же формат, который кто-то в мире считает стандартным.
Не кто-то "в мире", а который установлен в ОС.
И было бы в этом хоть что-нибудь сложное, даже без функций можно обойтись, если пару раз в скрипте фигурирует.
Код:
$sStandardAutoItTime = StringMid($s, 7, 4) & "/" & StringMid($s, 3, 2) & "/" & StringMid($s, 1, 2) & " " & StringMid($s, 12, 8) ; $s is a time in the format I consider as the standard one.
Любители регулярных выражений такое записывают даже короче, но вряд ли оптимальнее для выполнения.
Сообщение автоматически объединено:
В целом - да. НО....
Формат даты-времени на конкретной рабочей станции может быть другим (включая порядок: дни-месяца).
И (в том числе, в рамах этого самого формата или по нерадивости пользователя) числа могут быть без ведущих нулей и/или год двумя цифрами.....
Так что должна быть более сложная обработка.
Был бы тип "дата-время" - все было бы намного проще.
А кто когда пишет одну функцию каждый раз? Это и в самом деле ненормально.
Ну разберусь я сейчас, напишу нормальную функцию.
И даже через неделю в другом проекте вспомню что делал что-то уже, и даже найду эту функцию и перетащу в новый проект.
А месяца через 2-3 уже на другом компьютере при работе с другим проектом могу даже и не вспомнить что делал уже готовую функцию (склероз :-( ).
А вспомню, так не найду. И возможно, потому, что на тот комп я ее не переносил.
А была бы она в комплекте AutoIT, и (естественно) было бы о ней описание в хелп, то функция всегда была бы под рукой, и даже если забуду о ней, то в описании найду.
Пока нет доступа к вики... Попозже посмотрю. Всегда полезно узнать новое... ;-)
Сообщение автоматически объединено:

Не очень понятно, с какой целью вы хотите сравнивать даты и время и какой итог ожидаете
Именно так, как написал: сравнивать поочередно пары дат и по результатам сравнения выполнять то или иное действие для каждой пары дат (точнее: с ассоциированными с этими датами данными)
 
Автор
has

has

Новичок
Сообщения
4
Репутация
0
Встроенных функций нет. Но есть UDF
Код:
#include <Date.au3>
_DateDiff()

Да, я знаю про нее. Хотел использовать. Но в нее надо передавать даты в формате "YYYY/MM/DD[ HH:MM:SS]".
А если я смогу перевести из пользовательского формата "ДД.ММ.ГГГГ чч:мм:сс" (формата ОС) в формат "YYYY/MM/DD[ HH:MM:SS]", то смогу сравнивать просто строки.
Но не могу найти встроенную функцию для конвертации. Нет и в UDF (там я, конечно, тоже смотрел).
О том и печаль....
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
А если я смогу перевести из пользовательского формата "ДД.ММ.ГГГГ чч:мм:сс" (формата ОС) в формат "YYYY/MM/DD[ HH:MM:SS]"
Код:
ConsoleWrite(DataTimeFormat_('1.13.2021-14-23-7', 'DMYhms', 'YYYY/MM/DD hh:mm:ss') &@CRLF)

;$_vStr = строка образец, может содержать цифры и разделители
;
;$_vInFrmt = Входной шаблон указывается знаками
;    Y = год
;    M = месяц
;    D = число
;    h = часы
;    m = минуты
;    s = секунды
;разделители игнорируются, так как из строки образца берутся только цифры.
;
;$_vOutFrmt = Выходной шаблот такой же, но уже принимает разделители, которые будут вставлены в результат
;а так же если число например 1, а в шаблоне указать DD, то вернет 01 и так совсеми данными.

;пример DataTimeFormat_('2021.14/8-6=44',  'YMDhs', 'DD.MM.YYYY hh:mm:ss')
;вернет 08.14.2021 06:00:44

;пример DataTimeFormat_('2021.14/8-6=44',  'YMDhs', 'DD.MM.YY')
;вернет 08.14.21


Func DataTimeFormat_($_vStr, $_vInFrmt, $_vOutFrmt)
   $_vStr = StringRegExp($_vStr, '([0-9]+)', 3)
   $_vInFrmt = StringRegExpReplace($_vInFrmt, '(m)', 'n')
   $_vInFrmt = StringRegExp($_vInFrmt, '([YMDhns])', 3)
   $_iLen = UBound($_vStr)
   If @error Then Return SetError(1)
   $_iFLen = UBound($_vInFrmt)
   If @error Then Return SetError(1)
   If $_iFLen < $_iLen Then $_iLen = $_iFLen
   Local $_sMDay, $_sMon, $_sYear, $_sHour, $_sMin, $_sSec
   For $_i = 0 To $_iLen -1
      Switch $_vInFrmt[$_i]
      Case 'Y'
         $_sYear = $_vStr[$_i]
      Case 'M'
         $_sMon = $_vStr[$_i]
      Case 'D'
         $_sMDay = $_vStr[$_i]
      Case 'h'
         $_sHour = $_vStr[$_i]
      Case 'n'
         $_sMin = $_vStr[$_i]
      Case 's'
         $_sSec = $_vStr[$_i]
      EndSwitch
   Next
   $_vOutFrmt = StringRegExpReplace($_vOutFrmt, '(m)', 'n')
   $_vOutFrmt = StringRegExp($_vOutFrmt, '([YMDhns]+|[^YMDhns]+)', 3)
   $_iLen = UBound($_vOutFrmt)
   If @error Then Return SetError(1)
   $_vStr = ''
   For $_i = 0 To $_iLen -1
      $_iFLen = StringLen($_vOutFrmt[$_i])
      Switch StringLeft($_vOutFrmt[$_i], 1)
      Case 'Y'
         $_vOutFrmt[$_i] = $_sYear
      Case 'M'
         $_vOutFrmt[$_i] = $_sMon
      Case 'D'
         $_vOutFrmt[$_i] = $_sMDay
      Case 'h'
         $_vOutFrmt[$_i] = $_sHour
      Case 'n'
         $_vOutFrmt[$_i] = $_sMin
      Case 's'
         $_vOutFrmt[$_i] = $_sSec
      EndSwitch
      $_vOutFrmt[$_i] = StringRight($_vOutFrmt[$_i], $_iFLen)
      $_vStr &= StringFormat('%0'&$_iFLen&'s', $_vOutFrmt[$_i])
   Next
   Return $_vStr
EndFunc
 
  • Like
Реакции: has

lettterssino

Знающий
Сообщения
109
Репутация
10
Да, я знаю про нее. Хотел использовать. Но в нее надо передавать даты в формате "YYYY/MM/DD[ HH:MM:SS]".
А если я смогу перевести из пользовательского формата "ДД.ММ.ГГГГ чч:мм:сс" (формата ОС) в формат "YYYY/MM/DD[ HH:MM:SS]", то смогу сравнивать просто строки.
Но не могу найти встроенную функцию для конвертации. Нет и в UDF (там я, конечно, тоже смотрел).
О том и печаль....
Ну вообще странно требовать одну фукнцию, которая будет всё за вас делать. Если не предусмотрена она, то можете сами реализовать её. Тем более такие, которые то не очень и часто вообще используются и на создание данной фукнции автор наврятли будет тратить время.
 
Автор
has

has

Новичок
Сообщения
4
Репутация
0
Код:
ConsoleWrite(DataTimeFormat_('1.13.2021-14-23-7', 'DMYhms', 'YYYY/MM/DD hh:mm:ss') &@CRLF)

;$_vStr = строка образец, может содержать цифры и разделители
;
;$_vInFrmt = Входной шаблон указывается знаками
;    Y = год
;    M = месяц
;    D = число
;    h = часы
;    m = минуты
;    s = секунды
;разделители игнорируются, так как из строки образца берутся только цифры.
;
;$_vOutFrmt = Выходной шаблот такой же, но уже принимает разделители, которые будут вставлены в результат
;а так же если число например 1, а в шаблоне указать DD, то вернет 01 и так совсеми данными.

;пример DataTimeFormat_('2021.14/8-6=44',  'YMDhs', 'DD.MM.YYYY hh:mm:ss')
;вернет 08.14.2021 06:00:44

;пример DataTimeFormat_('2021.14/8-6=44',  'YMDhs', 'DD.MM.YY')
;вернет 08.14.21


Func DataTimeFormat_($_vStr, $_vInFrmt, $_vOutFrmt)
   $_vStr = StringRegExp($_vStr, '([0-9]+)', 3)
   $_vInFrmt = StringRegExpReplace($_vInFrmt, '(m)', 'n')
   $_vInFrmt = StringRegExp($_vInFrmt, '([YMDhns])', 3)
   $_iLen = UBound($_vStr)
   If @error Then Return SetError(1)
   $_iFLen = UBound($_vInFrmt)
   If @error Then Return SetError(1)
   If $_iFLen < $_iLen Then $_iLen = $_iFLen
   Local $_sMDay, $_sMon, $_sYear, $_sHour, $_sMin, $_sSec
   For $_i = 0 To $_iLen -1
      Switch $_vInFrmt[$_i]
      Case 'Y'
         $_sYear = $_vStr[$_i]
      Case 'M'
         $_sMon = $_vStr[$_i]
      Case 'D'
         $_sMDay = $_vStr[$_i]
      Case 'h'
         $_sHour = $_vStr[$_i]
      Case 'n'
         $_sMin = $_vStr[$_i]
      Case 's'
         $_sSec = $_vStr[$_i]
      EndSwitch
   Next
   $_vOutFrmt = StringRegExpReplace($_vOutFrmt, '(m)', 'n')
   $_vOutFrmt = StringRegExp($_vOutFrmt, '([YMDhns]+|[^YMDhns]+)', 3)
   $_iLen = UBound($_vOutFrmt)
   If @error Then Return SetError(1)
   $_vStr = ''
   For $_i = 0 To $_iLen -1
      $_iFLen = StringLen($_vOutFrmt[$_i])
      Switch StringLeft($_vOutFrmt[$_i], 1)
      Case 'Y'
         $_vOutFrmt[$_i] = $_sYear
      Case 'M'
         $_vOutFrmt[$_i] = $_sMon
      Case 'D'
         $_vOutFrmt[$_i] = $_sMDay
      Case 'h'
         $_vOutFrmt[$_i] = $_sHour
      Case 'n'
         $_vOutFrmt[$_i] = $_sMin
      Case 's'
         $_vOutFrmt[$_i] = $_sSec
      EndSwitch
      $_vOutFrmt[$_i] = StringRight($_vOutFrmt[$_i], $_iFLen)
      $_vStr &= StringFormat('%0'&$_iFLen&'s', $_vOutFrmt[$_i])
   Next
   Return $_vStr
EndFunc
Да, что-нибудь типа такого. Спасибо! не придется самому голову ломать (да и так красиво пока не смогу).
Вот почему такой функции нет в AutoIT или хотя бы в UDF?!
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
 
Верх