June 9, 2015

Форматы времени и даты

Посмотрим на полный список форматов времени и даты. Немного об этом было в ST и C#, или туда и обратно, теперь рассмотрим подробнее.
Все переменные типа даты, времени, промежутков, длительности и т. п. хранятся в ПЛК как 32-х разрядные целые, беззнаковые.

TIME


Длительность или промежуток времени в миллисекундах. Аналогом в C# можно считать TimeSpan.

Формат:
:= T#521h33m23s231ms;
:= TIME#521h33m23s231ms;

Время в строку: TIME_TO_STRING(T#12ms);
Результат типа STRING: 'T#12ms'

Строка во время: STRING_TO_TIME('T#127ms');
Результат типа TIME: T#127ms


DATE


Только дата  — как число секунд, прошедших с 1 января 1970 года.

Формат:
:= D#1993-06-12;
:= DATE#1993-06-12;

Дата в строку: DATE_TO_STRING(D#2002-08-18);
Результат типа STRING: 'D#2002-08-18'


DATE_AND_TIME или DT


Дата и время — как число секунд, прошедших с 1 января 1970 года. В C# можно использовать DateTime, не забывая, что в ST дата-время начинаются в Unix-стиле с 1970 года, а в C# с нулевого года.

Формат:
:= DT#1993-06-12-15:36:55;
:= DATE_AND_TIME#1993-06-12-15:36:55;

Дата-время в строку: DT_TO_STRING(DT#1998-02-13-14:20);
Результат типа STRING: 'DT#1998-02-13-14:20'

Несложно избавиться в строке от префиксов T#DT#, TOD# и т. п. Функция DELETE входит в стандартную библиотеку STANDART.lib. Удаляем слева n-символов:

str := DELETE(str, 2, 1); (*   T#... TIME_TO_STRING *)
str := DELETE(str, 3, 1); (*  DT#... DT_TO_STRING   *)
str := DELETE(str, 4, 1); (* TOD#... TOD_TO_STRING  *)


TIME_OF_DAY или TOD


Время дня: количество миллисекунд, прошедших начиная от начала дня — от ноля часов и ноля минут (00:00).

Формат:
:= TOD#12:34:56.123;
:= TIME_OF_DAY#12:34:56.123;

Время дня в строку: TOD_TO_STRING(TOD#14:01:05.123);
Результат типа STRING: 'TOD#14:01:05.123'



FILETIME (T_FILETIME)


Структура из двух DWORD (udint) полей. 64-х разрядное целое, содержит число 100-наносекундных интервалов с 1 января 1601 года (UTC). Для вменяемой работы с этим форматом (распаковки), существуют вспомогательные функции FILETIME_TO_DTFILETIME_TO_SYSTEMTIME, и в обратную сторону [...]_TO_FILETIME.


SYSTEMTIME (TIMESTRUCT)


Удобная структура с большим количеством удобных 16-разрядных полей типа WORD (uint):
  • wYear — год, 1970..2106;
  • wMonth — месяц, 1..12 (1 - январь, 2 - февраль и т. д); 
  • wDayOfWeek — день недели, 0..6 (0 - воскресенье (!), 1 - понедельник, ...);
  • wDay — день месяца, 1..31;
  • wHour — час, 0..23;
  • wMinute — минуты, 0..59;
  • wSecond — секунды, 0..59;
  • wMilliseconds — миллисекунды, 0..999.

Существует функция для преобразования строки в системное время: STRING_TO_SYSTEMTIME( 'YYYY-MM-DD-hh:mm:ss.xxx' ). На выходе получаем TIMESTRUCT.

Формат входной строки жестко фиксирован: через разделители '-' и ':' должны быть введены все цифры, а недостающие — заменены нулями:
  • YYYY — год,1601..9999;
  • MM — месяц, 01..12;
  • DD — день, 01..31;
  • hh — час, 00..23;
  • mm — минуты, 00..59;
  • ss — секунды, 00..59;
  • xxx — миллисекунды, 000..999.

Например:

ts := STRING_TO_SYSTEMTIME( '2012-01-30-05:12:09.567' );


Обновлено: 5 февраля 2017 г.

No comments

Post a Comment

Note: Only a member of this blog may post a comment.