|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Исходная задача: в таблице есть поле DATE_CREATED, в котором хранится время в UTC. Необходимо отобразить в DBGrid локальное время для текущего клиента. Firebird 3.0.7 Варианты решения: 1. В TField.OnGetText делать постоянный пересчет в локальное время. Недостаток: TField.OnGetText вызывается на любую перерисовку строки 2. Написать запрос Код: sql 1. 2. 3. 4.
Недостаток: я не могу из rdb$fields вытащить описание поля, т.к. поле в запросе перестает ссылаться на таблицу 3. Делать выборку не из таблицы, а из вьюхи. Вьюху описать так Код: sql 1. 2. 3. 4.
Переменную bias заполнять после коннекта. Тут, вроде все должно работать. Вопрос - может есть более прямой способ? Переход на Firebird 4 не предлагать. С уважением, Vasilisk ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 22:38 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_, Самый нормальный вариант (переход на 4) ты отверг. Мне нравится вариант 2. Причём тут rdb$fields мне не понятно. Чего ты там хочешь вытаскивать и какая привязка ломается? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 22:54 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Симонов Денис Причём тут rdb$fields мне не понятно Симонов Денис Чего ты там хочешь вытаскивать и какая привязка ломается? Код: sql 1. 2. 3. 4. 5. 6. 7.
А параметры поднимаются Код: pascal 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 23:02 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_1. В TField.OnGetText делать постоянный пересчет в локальное время. Недостаток: TField.OnGetText вызывается на любую перерисовку строки И в чём проблема? Сложение в Дельфи довольно быстрая операция. https://stackoverflow.com/questions/15567194/how-to-convert-local-time-to-utc-time-in-delphi-and-how-to-convert-it-back-from Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 23:03 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Сложение в Дельфи довольно быстрая операция. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 23:09 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_А последующее FormatDateTime? Да, в общем-то тоже. Оно же там по-любому происходит. Я не помню чтобы грид кэшировал значения ячеек. Хотя тебе никто не мешает это сделать. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2022, 23:28 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_ Исходная задача: в таблице есть поле DATE_CREATED, в котором хранится время в UTC. Необходимо отобразить в DBGrid локальное время для текущего клиента. Firebird 3.0.7 Варианты решения: 1. В TField.OnGetText делать постоянный пересчет в локальное время. Недостаток: TField.OnGetText вызывается на любую перерисовку строки 2. Написать запрос Код: sql 1. 2. 3. 4.
Недостаток: я не могу из rdb$fields вытащить описание поля, т.к. поле в запросе перестает ссылаться на таблицу А, собственно, почему недостаток? Значение ведь получается не от того поля которое в базе, и тогда какого, собственно, подсовывать описание не от него? Исходное поле должно иметь описание типа "Дата-время события в UTC". А новое поле - это "Дата-время события в localtime". В свое время думал о подобной конструкции - запихать в базу подписи к полям, но отказался, в т.ч. и по твоей причине. У меня в запросах много полей - производных от чего-то. Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно. А вот если поле редактировать - то там можно/нужно и длинное описание показать. Это приводит к тому что единственного описания будет недостаточно. Активно использую комментирование полей и таблиц в базе, но чисто в целях разработки, для себя же. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 08:24 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks У меня в запросах много полей - производных от чего-то. fraks Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно fraks А вот если поле редактировать - то там можно/нужно и длинное описание показать Код: powershell 1.
fraks Активно использую комментирование полей и таблиц в базе, но чисто в целях разработки, для себя же. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 12:18 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_> Недостаток: TField.OnGetText вызывается _Vasilisk_> на любую перерисовку строки А это где-то во что-то выливается? Ты же не тысячи строк ежесекундно перерисовываешь... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 14:36 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_ fraks У меня в запросах много полей - производных от чего-то. Тогда почему я вижу этот топик? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 15:40 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_ fraks Кроме того, пихать длинные подписи в Caption колонки в гриде неэффективно - их не видно fraks А вот если поле редактировать - то там можно/нужно и длинное описание показать Код: powershell 1.
Собственноручно пихать в реляционную базу строку CSV, с тем что бы потом обратно ее разбирать?? А не проще ли было бы, вместо rdb$fields.rdb$description, сделать свою таблицу, сразу с нужными колонками? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 19:36 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Способы 2 и 3 выглядят странновато по своей сути. На клиенте требуется рассчитать зональное клиентское(!) время по известному серверному абсолютному. Для этого зона отправляется на сервер, сервер производит расчет (сложение) и возвращает результат. Несколько через эээ... через сервер. Сервер SQL как сервис калькуляции. Все чисто клиентское должно считаться на клиенте, ИМХО. Использование при хранении зональных времен (Firebird 4) вряд ли помогло бы, скорее, внесло бы путаницу. В данной задаче ведь требуется время клиентской зоны, а не той, которая на сервере в значении даты содержится. Все равно пришлось бы пересчитывать из одной зоны в другую, почти то же самое, что из UTC, только с большей вероятностью ошибиться. Третий способ еще чреват тем, что если на клиенте поменяли зону, не прерывая коннекта (ну мало ли), пойдут искажения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 19:40 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
shalamyansky пойдут искажения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2022, 21:33 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
4. Не помню внутренностей TField, но я бы попробовал сделать свое поле - наследник TDateTimeField, добавил ему свойство Zone (по умолчанию - системная зона) и переписал ключевой метод GetValue или какой там с учетом этой зоны. Таким образом правильное зональное значение всегда имела бы сама дата-время, а не только демонстрационная строка. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 02:14 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Я бы взял вариант 2 и подумал над механизмом подписи полей не из rdb$fields.rdb$description. Не знаю, переваривают ли такое датасеты, а просто TpFIBQuery нормально отдает такие конструкции Код: plsql 1.
Или например, продумать систему именования полей, что бы они не пересекались ни с чем, и описания к ним засунуть в отдельную таблицу, наподобие rdb$fields.rdb$description. В конструкции подтягивания заголовков сделать обход сначала rdb$fields.rdb$description, а если остались пустые заголовки - то идем в отдельную таблицу с заголовками. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 08:18 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 08:19 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks> А не проще ли было бы, вместо rdb$fields.rdb$description, fraks> сделать свою таблицу, сразу с нужными колонками? Ну, до внедрения и повсеместного использования собственного слоя метаданных в БД ещё дорасти надо... И это точно не проще, хотя гораздо универсальнее. Ну и далеко не всегда это надо - ради одного Description я бы этого тоже не делал, хотя если там уже и Alignment, и Width, и Visible - то скорее пора, чем нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 11:46 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks> В конструкции подтягивания заголовков сделать обход fraks> сначала rdb$fields.rdb$description, а если остались пустые fraks> заголовки - то идем в отдельную таблицу с заголовками. Если вопрос интересный (судя по всему) - предлагаю создать отдельный топик. Заодно и на будущее пригодится. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 11:47 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks> Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным. У этого мнения есть какие-нибудь обоснования? В частности, конкретно для даты там можно подсовывать "вчера", "сегодня" и пр. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 11:48 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Calculated (InternalCalc) fields уже рассматривались ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 12:37 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
А это лучше OnGetText-а в данном случае? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 13:34 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам А это лучше OnGetText-а в данном случае? С точки зрения логики и правил использования инструмента - точно лучше. С точки зрения эффективности реализации - есть документация, исходники и отладчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 13:48 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Ну да, по идее они должны быть производительнее, конечно. Но лень проверять, да и сложно это (визуальную составляющую). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:39 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам fraks> Подсовывать чего-либо в TField.OnGetText считаю в корне неправильным. У этого мнения есть какие-нибудь обоснования? Запрос возвращает одно значение, а видим мы другое? Это нормально? А давайте поставим условие по дате. Ой... а чего-то оно неправильно срабатывает... Гаджимурадов Рустам В частности, конкретно для даты там можно подсовывать "вчера", "сегодня" и пр. С не меньшим успехом можно подсовывать и в запросе. Правда поле будет уже не TDateTime а String. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 14:57 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks> Запрос возвращает одно значение, а видим мы другое? Это нормально? Конечно. Запрос возвращает дату в своём формате, пользователь видит в своём. Ты только против дат таким образом возражаешь или в принципе? В "булевых" полях же ты как-то дорисовываешь? > А давайте поставим условие по дате. > Ой... а чего-то оно неправильно срабатывает... Отчего же. И фильтрация, и сортировка и всё остальное могут и должны рабоать корректно. > С не меньшим успехом можно подсовывать и в запросе. > Правда поле будет уже не TDateTime а String. Правильно, в запросе будет строка. А в OnGetText тип поля менять не нужно, это только визуализация. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 21:04 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам fraks> Запрос возвращает одно значение, а видим мы другое? Это нормально? Конечно. Запрос возвращает дату в своём формате, пользователь видит в своём. Ты только против дат таким образом возражаешь или в принципе? В "булевых" полях же ты как-то дорисовываешь? В FB2.5 булевых полей нет. Вместо них использую smallint, иногда char. Нет. Не дорисовываю. Булево поле, если оно мне нужно на клиенте так как оно нужно в базе - я тащу на клиента как есть. Если мне нужно его как-то "не так" отобразить - то в запросе его же привожу к нужному виду, через iif или case, и тащу вторым полем, чисто "для посмотреть". Исходное поле при этом может быть и скрытым. Оно будет доступно для всяких обработок на клиенте, а смотреть клиент будет на его визуальную копию. Но открыв скрытое поле с "исходником" можно получить доступ к тому что на самом деле в поле лежит. Т.к. я не храню заголовки полей в базе а прописываю их на клиенте по месту выполнения запроса, то проблемы как у автора топика у меня нет. Собственно, проблема автора в том, что он заточился на неоднозначное решение с хранением описания полей в базе и вытаскиванием оттуда их на клиента. Но там у этой палки концов существенно больше чем два, и один конец полезен, а остальные - создают проблемы. Вот автор и мечется. И отказаться от своей системы заголовков не хочется, и возиться с ней уже надоело. Гаджимурадов Рустам > А давайте поставим условие по дате. > Ой... а чего-то оно неправильно срабатывает... Отчего же. И фильтрация, и сортировка и всё остальное могут и должны работать корректно. Работает корректно, только видим мы несколько не то что хотим. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 08:26 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
> Исходная задача: в таблице есть поле DATE_CREATED, в котором хранится время в UTC. > Необходимо отобразить в DBGrid локальное время для текущего клиента. Я бы еще обратил внимание на то, что сама задача - далеко не так однозначна как кажется на первый взгляд. К примеру, я живу в городе, в котором за время моей жизни смещение от UTC менялось 3 раза. Соответственно, смещение от UTC - это может быть далеко не константа. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 08:32 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks Соответственно, смещение от UTC - это может быть далеко не константа. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 14:42 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraksЕсли мне нужно его как-то "не так" отобразить - то в запросе его же привожу к нужному виду, через iif или case, и тащу вторым полем, чисто "для посмотреть". Ну вот некоторые обходятся одним полем вместо двух. > открыв скрытое поле с "исходником" можно получить > доступ к тому что на самом деле в поле лежит. Так и с OnGetText-ом можно. Что именно тебя смущает? Сам факт наличия обработчика? > Собственно, проблема автора в том, что он заточился на > неоднозначное решение с хранением описания полей в > базе и вытаскиванием оттуда их на клиента. Это не проблема, а архитектурное решение (на мой взгляд тоже сомнительне, но это тема другого разговора и не в этом топике). Иметь доступ к исходному RDB$FIELD может захотеться и по другим причинам. > Работает корректно, только видим > мы несколько не то что хотим. Отчего же? Это зависит от того, как и что отображать. Сделаешь неправильно - будет неправильно, разумеется. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 16:28 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_ fraks Соответственно, смещение от UTC - это может быть далеко не константа. Ты видимо не понял "глубину глубин". Тут ни константой ни переменной не обойтись. Дело не в том что в твоей географии присутствуют клиенты из разных часовых поясов, а в том что для конкретного географического пункта смещение от UTC в разные периоды времени может быть разным. Так же могут меняться границы часовых поясов. Сегодня город/область в одном поясе, а завтра - в другом. Википедия: tz database Хабр: Tzdata — глобальная база знаний о часовых поясах На практике, это так же не панацея. Лично столкнулся с тем что: - пакет в линуксе, который работает с Tzdata, перестал обновляться, т.к. изменился формат самой Tzdata. - обновить пакет что бы он работал с новым форматом не получилось - слишком старый был линукс - после того как удалось победить 2 первых пункта, оказалось, что информация по моему городу в нем неактуальна И оставалась неактуальна длительное время, и кажись так актуальной и не стала (стала, но к тому времени я уже перестал на это надеяться). А город не какой-то мелкий, а третий в России по населению . Т.к. в России отменили переход на летнее/зимнее время, это позволило выбрать тупо фиксированное смещение. Но это, естественно, не позволяет таким образом корректно вычислить смещение задним числом (т.к. информация в базе неверна), и никто не гарантирует что опять кто-то не выдумает игры с часовым поясом. Поэтому, если информация о корректности в локальном времяисчислении критична, я бы подумал над собственной версией Tzdata для своей географии. Что бы в случае чего - не ждать манны от бесплатных общественных сервисов. Вот такая красота для НСО. Да и не только. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 18:44 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ух-ты, даже не 3 раза менялось, а 7 раз! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 20:32 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
fraks Ты видимо не понял "глубину глубин". Тут ни константой ни переменной не обойтись. fraks Сегодня город/область в одном поясе, а завтра - в другом. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2022, 01:34 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_А моя задача этот часовой пояс (а вернее текущее смещение по UTC) считать. Все. Не всё. Потому что у тебя не время в поле, а timestamp. Тебе не текущее смещение надо получать, а то каким оно было в тот момент. https://docs.microsoft.com/en-us/windows/win32/api/timezoneapi/nf-timezoneapi-systemtimetotzspecificlocaltime Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2022, 02:14 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Потому что у тебя не время в поле, а timestamp. Тебе не текущее смещение надо получать, а то каким оно было в тот момент. Чем это лучше ручного вычисления смещения на основании GetTimeZoneInformation и прибавления этого смещения к значению в базе? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2022, 17:02 |
|
Отобразить локальное время
|
|||
---|---|---|---|
#18+
_Vasilisk_Чем это лучше ручного вычисления смещения на основании GetTimeZoneInformation и прибавления этого смещения к значению в базе? В базе лежит полночь первого января. Ручное вычисление на основании текущей таймзоны сейчас даст 03:00, а через полгода у той же записи будет 02:00. Это действительно то, что тебе нужно?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2022, 17:57 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1559847]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
160ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 291ms |
0 / 0 |