Перевод Unix time в дату время

Помечено: 

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

    Добрый день, подскажите как перевести данные времени представленных как Unix time в дату время которые нормально отображаются в веб клиенте.
    Сделал новое поле до расчетное телеизмерений использовал как и встроенную формулу DecodeDate(Val(101)) так и свой код.
    вариант 1. public static DateTime DecodeUnixDat (double timestamp)
    {
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    DateTime last = origin.AddSeconds(timestamp).ToLocalTime();
    return last;
    }.
    Вариант 2.
    public DateTime UNTime (double se)
    {long sec=Convert.ToInt64(se);
    DateTimeOffset dateOffset = DateTimeOffset.FromUnixTimeSeconds(sec);
    DateTime dateOff=dateOffset.LocalDateTime;
    return dateOff;
    }
    но на выходе какие то неопределенные значения ! — либо дата 30.12.1899 00:00:00

    Коды как бы рабочие время возвращают по может форматы не совпадают с используемым в RapidScada, или нужно приводить к другим типам данных при помощи методов ToOADate() либо FromOADate.
    И как данныю метку времени прикрепить к другому каналу?
    И есть ли какая то инструкция по созданию своего драйвера либо у кого то есть наработки по подключению к веговскому серверу по средствам websocket

    • Эта тема была изменена 1 год, 9 месяцев назад от trv. Причина: Ошибки
    #23936
    manjey73
    Участник

    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0); по идее это не Unix Time хоть вы в него и вводите начальные значения времени Unix

    #23937
    trv
    Участник

    Я получаю смещение от данной даты, что бы получить реальное время нужно к 1.1.1970 прибавить получены данные в секундах

    #23938
    manjey73
    Участник

    Чтобы в канале отобразить время, установив формат DateTime то да, его надо приводить к double ToOADate() канал содержит именно double а не структуру DateTime

    Вроде как устанавливая 1970-й год надо еще указать DateTimeKind.UTC

    DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

    И уже потом таймштамп прибавлять

    #23944
    Mikhail
    Модератор

    Добрый день!
    Кажется, уже были на форуме такие вопросы. Попробуйте воспользоваться поиском.
    Для Rapid SCADA нужно преобразовать DateTime в double методом EncodeDate (см. таблицу Формулы) или ToOADate(), что примерно то же самое.

    #23945
    Mikhail
    Модератор

    С помощью https://dotnetfiddle.net/ проверьте, что Ваше преобразование корректно. А затем примените к нему EncodeDate или ToOADate для получения double.

    #23973
    trv
    Участник

    Преобразование корректно, после своего скрипта использовал приведение ToOADate дата стала отображаться в читаемом виде

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