дата и время

Просмотр 10 сообщений - с 1 по 10 (из 10 всего)
  • Автор
    Сообщения
  • #36154
    ivan3012020
    Участник

    Добрый день! Я получаю с контролера данные о дате и о времени в типе данных DateTime. Подскажите как мне их более правильно принять (я поставил тип данных на получение int. И второй вопрос как правильно вывести время на визуализацию, как я понял есть готовые формулы для этого ?

    • Тема изменена 1 год, 4 месяца назад пользователем Mikhail.
    #36155
    manjey73
    Участник

    Что за контроллер? в каком формате он передает DateTime? потому что в C# DateTime это структура, а из контроллера может быть например число в формате UnixTime например

    #36156
    ivan3012020
    Участник

    Контролер Плк 63. Опрашиваю 56 адрес. Ниже скрин из кодесис https://disk.yandex.ru/i/KoDfmhpDOVq-qw

    #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 в зависимости всю дату со временем или по отдельности.
    Тип данных оставить по умолчанию пустым.

    #36160
    manjey73
    Участник

    ааа, у вас там по умолчанию 2000 год. Это вероятно измененный формат относительно UnixTime чтобы на дольше хватало.

    пробовать надо. Возможно просто поменять 1970 на 2000 год, но не факт.

    • Ответ изменён 1 год, 6 месяцев назад пользователем manjey73.
    #36163
    Mikhail
    Модератор

    Добрый день!
    Нужно покопаться в документации CodeSys, чтобы выяснить как кодируется дата и время.

    #36170
    manjey73
    Участник

    Да там Unix, просто они начинают отсчет нынче с 2000 года.
    Типа то ли обновленный вариант UnixTime то ли что… в общем чтобы он не издох в 2038 году 🙂

    #36177
    JurasskPark
    Участник

    Так пришлите Integer время и его значение.
    У меня есть аж целых три варианта конвертирования)

    #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]);
     }
    

    Вот примеры.

    #36465
    ivan3012020
    Участник

    Я поменял 1970 на 2000 год и вроде бы все верно работает, единственное что как записывать дату в контролёр. Если я шлю дату в формате unix (то есть просто записываю число на адрес то все окей), но если я выставляю чисто и год в формате дата тайм, то получается билеберда.

Просмотр 10 сообщений - с 1 по 10 (из 10 всего)
  • Для ответа в этой теме необходимо авторизоваться.