Стартовая страница › Форумы › Понять, как работает ПО › Формулы › дата и время
- В этой теме 9 ответов, 4 участника, последнее обновление 1 год, 4 месяца назад сделано
ivan3012020.
-
АвторСообщения
-
13.12.2024 в 12:43 #36154
ivan3012020
УчастникДобрый день! Я получаю с контролера данные о дате и о времени в типе данных DateTime. Подскажите как мне их более правильно принять (я поставил тип данных на получение int. И второй вопрос как правильно вывести время на визуализацию, как я понял есть готовые формулы для этого ?
-
Тема изменена 1 год, 4 месяца назад пользователем
Mikhail.
13.12.2024 в 13:24 #36155
manjey73УчастникЧто за контроллер? в каком формате он передает DateTime? потому что в C# DateTime это структура, а из контроллера может быть например число в формате UnixTime например
13.12.2024 в 13:33 #36156ivan3012020
УчастникКонтролер Плк 63. Опрашиваю 56 адрес. Ниже скрин из кодесис https://disk.yandex.ru/i/KoDfmhpDOVq-qw
13.12.2024 в 13:51 #36159
manjey73УчастникНу скорее всего у вас там число в формате Unix, так как передача через регистры идет.
Делали формулу вроде// Конвертирование времени UTC в DateTime public static double UnixTimeStampToDateTime( double unixTimeStamp ) { // Unix timestamp is seconds past epoch DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); dateTime = dateTime.AddSeconds( unixTimeStamp ).ToUniversalTime(); // ToUniversalTime() ToLocalTime() return dateTime.ToOADate(); }Добавить в Скрипты, в канале указать входную формулу UnixTimeStampToDateTime(Cnl)
Формат канала DateTime, Date, Time в зависимости всю дату со временем или по отдельности.
Тип данных оставить по умолчанию пустым.13.12.2024 в 13:52 #36160
manjey73Участникааа, у вас там по умолчанию 2000 год. Это вероятно измененный формат относительно UnixTime чтобы на дольше хватало.
пробовать надо. Возможно просто поменять 1970 на 2000 год, но не факт.
-
Ответ изменён 1 год, 6 месяцев назад пользователем
manjey73.
13.12.2024 в 14:13 #36163
MikhailМодераторДобрый день!
Нужно покопаться в документации CodeSys, чтобы выяснить как кодируется дата и время.13.12.2024 в 14:30 #36170
manjey73УчастникДа там Unix, просто они начинают отсчет нынче с 2000 года.
Типа то ли обновленный вариант UnixTime то ли что… в общем чтобы он не издох в 2038 году 🙂13.12.2024 в 16:33 #36177
JurasskParkУчастникТак пришлите Integer время и его значение.
У меня есть аж целых три варианта конвертирования)13.12.2024 в 23:25 #36179
JurasskParkУчастникpublic static DateTime DateFromByteArray(byte[] bytes) { if (bytes.Length != 4) { throw new FormatException("Size of byte array != 4"); } return new DateTime(2000 + bytes[2], bytes[1], bytes[0]); } public static DateTime TimeFromByteArray(byte[] bytes) { if (bytes.Length != 4) { throw new FormatException("Size of byte array != 4"); } return new DateTime(0, 0, 0, bytes[2], bytes[1], bytes[0]); } public static DateTime DateTimeFromByteArray6(byte[] bytes) { if (bytes.Length != 6) { throw new FormatException("Size of byte array != 6"); } return new DateTime(2000 + bytes[2], bytes[1], bytes[0], bytes[5], bytes[4], bytes[3]); } public static DateTime DateTimeFromByteArray8(byte[] bytes) { if (bytes.Length != 8) { throw new FormatException("Size of byte array != 8"); } return new DateTime(2000 + bytes[2], bytes[1], bytes[0], bytes[6], bytes[5], bytes[4]); }Вот примеры.
21.01.2025 в 16:07 #36465ivan3012020
УчастникЯ поменял 1970 на 2000 год и вроде бы все верно работает, единственное что как записывать дату в контролёр. Если я шлю дату в формате unix (то есть просто записываю число на адрес то все окей), но если я выставляю чисто и год в формате дата тайм, то получается билеберда.
-
Тема изменена 1 год, 4 месяца назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.