Формирование значения Дата/Время из драйвера

Стартовая страница Форумы Разработка и интеграция Формирование значения Дата/Время из драйвера

  • В этой теме 27 ответов, 5 участников, последнее обновление 9 лет назад сделано Mikhail.
Просмотр 13 сообщений - с 16 по 28 (из 28 всего)
  • Автор
    Сообщения
  • #1750
    manjey73
    Участник

    Михаил, так может вы распишите унаследованный из Delphi формат, а мы уже подгонимся ?
    Или если DateTime.ToOADate() окажется достаточно близок к нему то произойдет переход ?

    #1751
    Romiros
    Участник

    Михаил. Да с нестандартными данными идея хорошая. Но мне нужно просто сформировать дневной архив из часовых данных. Я посмотрел исходники, по идее проблем возникнуть не должно. Сделать по аналогии с часовым срезом и добавить дорасчетный и ТС. Единственное изменить пару условий, где проверяется минутный или часовой срез. Но это так на вскидку, конечно надо пробовать.
    И можно еще вопрос? Дата записи среза в файл формируется на основании имени файла? Я просто хотел сдвинуть начало суток(Газовые сутки) на 10 часов утра. Так вот писать в нужный файл получается(т.е. на день назад) время соответствует а вот дата смещается.

    Не знаю понятно ли объяснил. К примеру мне нужно чтобы данные за 17.03.2016 08:37:00 записывались в файл m160316.dat. Они туда пишутся, но дата получается 16.03.2016.

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

    Дата берётся из имени файла. На мой взгляд, нужно колдовать с отображением, чтобы получить контрактный час (кажется так это смещение называется).

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

    Реализация формата даты:
    https://github.com/RapidScada/scada/blob/master/ScadaData/ScadaData/Data/Arithmetic.cs

    http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_TDateTime.html

    Если он не совпадёт с DateTime.ToOADate(), то нужно от него уходить.

    #1755
    Romiros
    Участник

    Думал об этом, но куча неудобств возникает. Особенно если делать дневные архивы. У нас контрактный час всегда 10:00 поэтому удобнее сразу так и писать в базу, удобно отображать срезы и так далее.
    Т.е. в принципе я могу переделать механизм записи добавив некий инкремент(Контрактный час) в настройки scada-сервера?

    #1756
    manjey73
    Участник

    Михаил, проверьте пожалуйста, соответствует ли это варианту Delphi.
    В С# ToOADate, FromOADate тоже вроде пляшет от 30 декабря 1899 года

    17.03.2016 15:38:47 — #03#59#B1#DC#D4#B9#E4#40, 42446,6519400347
    17.03.2016 15:38:52 — #26#EA#2D#DD#D4#B9#E4#40, 42446,6519994329
    17.03.2016 15:39:28 — #0E#62#8E#E0#D4#B9#E4#40, 42446,6524116435

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

    Т.е. в принципе я могу переделать механизм записи добавив некий инкремент(Контрактный час) в настройки scada-сервера?

    Думаю, что это может привести к непредсказуемым ошибкам. Будет надежнее, если Вы разработаете веб страницу, которая будет отображать данные в нужном Вам виде на основе существующего механизма работы с данными.

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

    Михаил, проверьте пожалуйста, соответствует ли это варианту Delphi.
    В С# ToOADate, FromOADate тоже вроде пляшет от 30 декабря 1899 года

    Напишите консольное приложение, которое будет сравнивать double, полученные от DateTime.ToOADate() и Arithmetic.EncodeDateTime() на большом наборе значений даты и времени. Проверка вручную ничего не гарантирует.

    #1759
    manjey73
    Участник

    Сравнил, отличаются в миллисекундах вероятно.

    18.03.2016 13:21:26______18.03.2016 13:21:33______18.03.2016 13:21:40
    42447,5565534375_________42447,5566373727_________42447,5567141088
    42447,5565534412_________42447,5566373812_________42447,5567141101
    18.03.2016 13:21:26______18.03.2016 13:21:33______18.03.2016 13:21:40

    18.03.2016 13:21:45______18.03.2016 13:21:50
    42447,5567719907_________42447,5568361806
    42447,5567719954_________42447,5568361889
    18.03.2016 13:21:45______18.03.2016 13:21:50

    1 дата (date1) — получена по DateTime.Now
    1-ый double (dd) получен при помощи date1.ToOADate()
    2-ой double (dd1) получен при помощи Arithmetic.EncodeDateTime(date1)
    2-я дата получена при помощи DateTime.FromOADate(dd1)

    Так что если миллисекунды не так важны, то даты и время вроде совпадают, хотя и есть отличия в самих double. надо подольше погонять, появится ли расхождение в секундах в какие-то моменты времени. Либо это просто не идеальный расчет миллисекунд в какой-то из формул.

    • Этот ответ был изменен 9 лет назад от manjey73.
    • Этот ответ был изменен 9 лет назад от manjey73.
    #1762
    manjey73
    Участник

    Расхождений в секундах вроде не замечено.

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

    Может быть ещё вывести разность этих double для наглядности? И перевести разность в миллисекунды.

    #1764
    manjey73
    Участник

    Скорее всего один из методов просто обрезает миллисекунды.
    Только какой из двух не проверял.

    p.s. предположение.

    ща проверю 🙂

    Миллисекунды либо равны, либо в оригинальном варианте DateTime.Now на 1-ну миллисекунду меньше.

    Там еще что-то сидит, кроме этого, что не учитывает функция Delphi, не связанное с временем как таковым.

    • Этот ответ был изменен 9 лет назад от manjey73.
    • Этот ответ был изменен 9 лет назад от manjey73.
    #1768
    Mikhail
    Модератор

    Скорее всего, эта погрешность возникает при работе с double. Даже от порядка операций сложения и умножения зависит конечный результат.
    Думаю, можно использовать ToOADate для Ваших целей.

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