Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Некорректная работа даты/времени.
- В этой теме 34 ответа, 3 участника, последнее обновление 9 месяцев, 2 недели назад сделано
Mikhail.
-
АвторСообщения
-
08.03.2025 в 22:59 #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
09.03.2025 в 09:13 #37138
manjey73УчастникПривыкайте, придумывайте костыли 😀
Сервер сохраняет любое поступившее время как UTC.
Web показывает время, выставленное по настройкам.В общем думайте, как вам будет проще.
Вполне возможно достаточно будет заменить в формуле Now на UTCNow09.03.2025 в 17:22 #37143timon84
УчастникПривыкайте, придумывайте костыли 😀
Сервер сохраняет любое поступившее время как UTC.
Web показывает время, выставленное по настройкам.Думал с новой версией костылей будет меньше…
Этот баг исправлять не планируется?По поводу UtcNow() — оно сохраняет текущее время НО! UtcNow()-UtcNow()=3:00:00 !!! как это победить???
09.03.2025 в 18:34 #37144
manjey73УчастникЭто не баг, это целенаправленный переход на UTC время сохранения данных. Который добавил проблем по моему мнению.
Ну как бы не может два UTC дать 3 часа, вроде это нонсенс.
09.03.2025 в 18:59 #37145
manjey73УчастникНу да, есть такой баг. Еще один в копилку Михаилу 🙂
А все из-за того, что Web честно применяет к значению типа DateTime и Time настройки часового пояса Web.
Независимо, что вы там используете Utc или Local Time.Может вам попробовать не вычисление времени в виде вычитания, а использовать TimeSpan ?
09.03.2025 в 19:34 #37146
manjey73УчастникИз структуры TimeSpan можно получить TotalSecons в формате double.
И уже его как-то показывать строкой в виде времени, но не применяя при этом Формат Time в канале.В общем косяк в том, что Формат канала Time в данном случае у вас под запретом. И применять его нельзя
Опишите что вы хотите в целом?
TimeSpan так же можно в виде времени сохранять в принципе. Просто делая ему ToOADate()09.03.2025 в 19:40 #37147
manjey73УчастникИзвиняюсь, к TimeSpan не применяется ToOADate
09.03.2025 в 21:30 #37148timon84
УчастникОпишите что вы хотите в целом?
При нажатии на кнопку один «динамический текст» показывает время нажатия на кнопку, второй «динамический текст» показывает время прошедшее с момента нажатия на кнопку.
09.03.2025 в 21:36 #37149
manjey73УчастникМожно соханять TimeSpan TotalSecons в канале.
А отображать в виде текста.
В ваших формулах разница времени идёт постоянно, так и должно быть?09.03.2025 в 21:39 #37150timon84
УчастникНе совсем понял о какой разнице идет речь.
У меня в одном канале хранится время события, а во втором время прошедшее с момента события, вот второй канал как раз постоянно идет на увеличение до нового события.09.03.2025 в 22:02 #37151
manjey73УчастникНу я и говорю, что у вас 3-я формула всегда считает и увеличивается.
То есть это не между старт/стоп а между текущим и зафиксированным временем.Сейчас сделаю, у меня почему-то миллисекунды еще появились с какого-то перепуга
09.03.2025 в 22:13 #37152timon84
УчастникМожно соханять TimeSpan TotalSecons в канале.
Думал подобное реализовать, но мысли были в направлении UnixTime().
09.03.2025 в 22:23 #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 так как создается массив каналов для строки)09.03.2025 в 22:25 #37154
manjey73УчастникUnixTime добавит больше формул и опять же, спасибо переходу БД на запись в UTC (Что с одной стороны правильно) нельзя применять формат Time в данном случае, так как автоматом Web сервер прилепит разницу между UTC и Local Time.
10.03.2025 в 08:20 #37156timon84
УчастникСпасибо. Буду пробовать.
P.S. Личное мнение: переход на время UTC и добавление часового пояса по умолчанию без возможности изменить это — совсем не верное решение. Можно было, наверное, где-то в настройках системы поставить опцию включения/выключения этого безобразия».
-
Ответ изменён 1 год, 1 месяц назад пользователем
timon84.
-
Ответ изменён 1 год, 1 месяц назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.