Форум » [x]Harbour » Как узнать часовой пояс установленный у юзера ? » Ответить

Как узнать часовой пояс установленный у юзера ?

Andrey: Как узнать часовой пояс UTC установленный на ПК средствами Harbour ? В базе PostgreSql на сайте время пишу без учёта часовых поясов. А у юзера на ПК нужно выводить время с учётом часового пояса. Как это сделать на Харборе ?

Ответов - 16

Pasha: Есть функция winapi GetTimeZoneInformation Она заполняет структуру TIME_ZONE_INFORMATION, которая содержит поля - названия часового пояса, смещение от utc в минутах, и еще некоторые. Обертки нет ни в харборе, ни в hmg

Andrey: А вот у этих есть что-то http://forums.fivetechsupport.com/viewtopic.php?f=3&t=28628 Но мне с моим английским, трудно понять....

Pasha: Так в наше время чтобы понять достаточно гуглтранслейта А что надо то ? В этой теме тоже нет обертки. Надо название или смещение в минутах ?


Pasha: [pre]#include <windows.h> HB_FUNC( GETTIMEZONEMIN ) { TIME_ZONE_INFORMATION tzi; DWORD lRet = GetTimeZoneInformation(&tzi); if( lRet == TIME_ZONE_ID_INVALID ) hb_retnl( -1 ); else hb_retnl( tzi.Bias ); } [/pre] Такая функция у меня вернула -180 (UTC+3, московское время )

Петр: А еще можно использовать встроенные функции hb_UTCOffset hb_TSToUTC

Петр: Pasha пишет: Надо название или смещение в минутах ? А вот действительно, что нужно? hb_UTCOffset возвращает смещение в секундах. А если нужно название - простенькую UDF набросать.

Andrey: Pasha пишет: Надо название или смещение в минутах ? У меня на сайте в таблицу (база PostgreSql) в колонку (timestamp with time zone) пишется время выполнения с телефонов мастеров. Далее делаю импорт таблицы в dbf Харбора и вот тут в поле TimeLog надо писать время с учётом часового пояса.

Петр: Andrey пишет: Далее делаю импорт таблицы Если импорт выполнен с использованием sddpg (Postgre SQL Database Driver) то поле timestamp with time zone импортируется в виде строки в 26 символов и эту строку просто нужно правильно интерпретировать.

Pasha: hb_TSToUTC переводит локальное время в utc. Нам надо наоборот. Такой функции нет, но обойдемся и без нее делаем так: пусть dt - время в utc тогда dt + (dt - hb_tstoutc(dt)) - локальное время

Andrey: Да, при импорте получается строка из которой выделяю время. Получается текстовая строка. А как дальше её преобразовать с учётом часового пояса ? Допустим строка cTime := "07:39:56" А дальше пока не придумал как сделать...

Петр: Andrey пишет: Допустим строка cTime := "07:39:56" Работать нужно не с time, а с timestamp Как-то так function main() local ts, tsU ts := hb_StrToTS("2021-03-02 01:12:13.10") ? hb_strFormat("%1$02d:%2$02d:%3$02d", hb_Hour(ts), hb_Minute(ts), hb_Sec(ts)) tsU := hb_TSToUTC( ts ) ? hb_strFormat("%1$02d:%2$02d:%3$02d", hb_Hour(tsU), hb_Minute(tsU), hb_Sec(tsU)) return 0 Ну и ответ на вопрос вынесенный в название темы (упрощенное решение) function main() local tz := int(hb_UTCOffset()/(60*60)) ? hb_strFormat("UTC%1$+d", tz) return 0

Andrey: Петр пишет: Работать нужно не с time, а с timestamp Как-то так Спасибо БОЛЬШОЕ !

Pasha: Если переводить utc время в локальное через hb_utcoffset, то лучше этой функции передавать параметр, иначе для часового пояса, в котором летнее и зимнее время различны, результат может искажаться на час пусть dt - дата+время в utc тогда перевод в локальное время можно сделать так dt + (dt - hb_tstoutc(dt)) или так: dt + hb_UTCOffset(dt)/(3600*24)

Andrey: Спасибо БОЛЬШОЕ Pasha !

Петр: Нюансы, конечно, есть. И в идеале Андрею лучше бы было использовать возможности сервера для преобразования дат. У pg отличная документация, в т.ч. и на русском. Но и все остальное нужно знать - что такое временные зоны, какие возможности в работу с временем и датами Harbour, нужно учитывать где установлен и как настроен SQL сервер, какой тип полей используется в БД. А без понимания всего этого можно и накосячить Андрею рекомендую прочитать, может подтолкнет к правильным выводам - Как в PostgreSQL привести дату TIMESTAMP WITH TIME ZONE к часовому поясу

Andrey: Петр Спасибо БОЛЬШОЕ !



полная версия страницы