Некорректная работа даты/времени.

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

    Здравствуйте. Переходим на В6 потихоньку и столкнулся с проблемой которой нет в В5.
    Задача вести учет времени команды(время нажатия на кнопку) и время прошедшее с момента команды.

    Вроде все просто:
    канал 1 = Now()
    канал 2 = Val() ; команда — SetVal(2, Val(1))
    канал 3 = Val(1) — Val(2)

    и тут начинается волшебство:
    Значение Now() — на 3 часа больше актуального времени.
    Разница в момент сброса равна 3 часа (т.е. датавремя — датавремя = 3ч 0_о)

    Как это сейчас работает не могу понять вообще. 2 дня уже сижу вроде над простой проблемой. Помогите, пожалуйста.

    https://cloud.mail.ru/public/Z5j6/F7vWscwcf

    код

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

    Привыкайте, придумывайте костыли 😀
    Сервер сохраняет любое поступившее время как UTC.
    Web показывает время, выставленное по настройкам.

    В общем думайте, как вам будет проще.
    Вполне возможно достаточно будет заменить в формуле Now на UTCNow

    #37143
    timon84
    Участник

    Привыкайте, придумывайте костыли 😀
    Сервер сохраняет любое поступившее время как UTC.
    Web показывает время, выставленное по настройкам.

    Думал с новой версией костылей будет меньше…
    Этот баг исправлять не планируется?

    По поводу UtcNow() — оно сохраняет текущее время НО! UtcNow()-UtcNow()=3:00:00 !!! как это победить???

    #37144
    manjey73
    Участник

    Это не баг, это целенаправленный переход на UTC время сохранения данных. Который добавил проблем по моему мнению.

    Ну как бы не может два UTC дать 3 часа, вроде это нонсенс.

    #37145
    manjey73
    Участник

    Ну да, есть такой баг. Еще один в копилку Михаилу 🙂
    А все из-за того, что Web честно применяет к значению типа DateTime и Time настройки часового пояса Web.
    Независимо, что вы там используете Utc или Local Time.

    Может вам попробовать не вычисление времени в виде вычитания, а использовать TimeSpan ?

    #37146
    manjey73
    Участник

    Из структуры TimeSpan можно получить TotalSecons в формате double.
    И уже его как-то показывать строкой в виде времени, но не применяя при этом Формат Time в канале.

    В общем косяк в том, что Формат канала Time в данном случае у вас под запретом. И применять его нельзя

    Опишите что вы хотите в целом?
    TimeSpan так же можно в виде времени сохранять в принципе. Просто делая ему ToOADate()

    #37147
    manjey73
    Участник

    Извиняюсь, к TimeSpan не применяется ToOADate

    #37148
    timon84
    Участник

    Опишите что вы хотите в целом?

    При нажатии на кнопку один «динамический текст» показывает время нажатия на кнопку, второй «динамический текст» показывает время прошедшее с момента нажатия на кнопку.

    #37149
    manjey73
    Участник

    Можно соханять TimeSpan TotalSecons в канале.
    А отображать в виде текста.
    В ваших формулах разница времени идёт постоянно, так и должно быть?

    #37150
    timon84
    Участник

    Не совсем понял о какой разнице идет речь.
    У меня в одном канале хранится время события, а во втором время прошедшее с момента события, вот второй канал как раз постоянно идет на увеличение до нового события.

    #37151
    manjey73
    Участник

    Ну я и говорю, что у вас 3-я формула всегда считает и увеличивается.
    То есть это не между старт/стоп а между текущим и зафиксированным временем.

    Сейчас сделаю, у меня почему-то миллисекунды еще появились с какого-то перепуга

    #37152
    timon84
    Участник

    Можно соханять TimeSpan TotalSecons в канале.

    Думал подобное реализовать, но мысли были в направлении UnixTime().

    #37153
    manjey73
    Участник

    Добавить в скрипты

    public double TsTotalSec(int cnl1, int cnl2)
    {
    DateTime date1 = DateTime.FromOADate(Val(cnl1));
    DateTime date2 = DateTime.FromOADate(Val(cnl2));
    TimeSpan interval = date1 - date2;
    return (long)interval.TotalSeconds;
    }

    Вместо вашей формулы Val(1)-Val(2) (канал 3)
    Во входной формуле прописать TsTotalSec(1, 2)
    Вы получите канал со значением целого количества секунд между событиями

    Добавить в скрипты

    public string TsFromSeconds(double Sec)
    {
    return TimeSpan.FromSeconds(Sec).ToString();
    }

    Добавить еще одну формулу в следующий канал 4 для отображения
    SplitAscii(()=> TsFromSeconds(Val(3)))
    Тип данный ASCII String, Формат String, длина данных 3 (будут заняты каналы 4,5,6 так как создается массив каналов для строки)

    #37154
    manjey73
    Участник

    UnixTime добавит больше формул и опять же, спасибо переходу БД на запись в UTC (Что с одной стороны правильно) нельзя применять формат Time в данном случае, так как автоматом Web сервер прилепит разницу между UTC и Local Time.

    #37156
    timon84
    Участник

    Спасибо. Буду пробовать.

    P.S. Личное мнение: переход на время UTC и добавление часового пояса по умолчанию без возможности изменить это — совсем не верное решение. Можно было, наверное, где-то в настройках системы поставить опцию включения/выключения этого безобразия».

    • Ответ изменён 1 год, 1 месяц назад пользователем timon84.
Просмотр 15 сообщений - с 1 по 15 (из 35 всего)
  • Для ответа в этой теме необходимо авторизоваться.