Автор | Сообщение |
|
| постоянный участник
|
Пост N: 6896
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.02.21 23:51. Заголовок: Как узнать часовой пояс установленный у юзера ?
Как узнать часовой пояс UTC установленный на ПК средствами Harbour ? В базе PostgreSql на сайте время пишу без учёта часовых поясов. А у юзера на ПК нужно выводить время с учётом часового пояса. Как это сделать на Харборе ?
|
|
|
Ответов - 16
[только новые]
|
|
|
| Администратор
|
Пост N: 4000
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.03.21 09:25. Заголовок: Есть функция winapi ..
Есть функция winapi GetTimeZoneInformation Она заполняет структуру TIME_ZONE_INFORMATION, которая содержит поля - названия часового пояса, смещение от utc в минутах, и еще некоторые. Обертки нет ни в харборе, ни в hmg
|
|
|
|
| постоянный участник
|
Пост N: 6897
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.03.21 11:15. Заголовок: А вот у этих есть чт..
|
|
|
|
| Администратор
|
Пост N: 4001
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.03.21 11:28. Заголовок: Так в наше время что..
Так в наше время чтобы понять достаточно гуглтранслейта А что надо то ? В этой теме тоже нет обертки. Надо название или смещение в минутах ?
|
|
|
|
| Администратор
|
Пост N: 4002
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.03.21 11:57. Заголовок: #include <window..
#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 ); } Такая функция у меня вернула -180 (UTC+3, московское время )
|
|
|
|
| постоянный участник
|
Пост N: 1588
Зарегистрирован: 09.10.06
|
|
Отправлено: 01.03.21 12:54. Заголовок: А еще можно использо..
А еще можно использовать встроенные функции hb_UTCOffset hb_TSToUTC
|
|
|
|
| постоянный участник
|
Пост N: 1589
Зарегистрирован: 09.10.06
|
|
Отправлено: 01.03.21 12:58. Заголовок: Pasha пишет: Надо н..
Pasha пишет: цитата: | Надо название или смещение в минутах ? |
| А вот действительно, что нужно? hb_UTCOffset возвращает смещение в секундах. А если нужно название - простенькую UDF набросать.
|
|
|
|
| постоянный участник
|
Пост N: 6898
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.03.21 15:56. Заголовок: Pasha пишет: Надо н..
Pasha пишет: цитата: | Надо название или смещение в минутах ? |
| У меня на сайте в таблицу (база PostgreSql) в колонку (timestamp with time zone) пишется время выполнения с телефонов мастеров. Далее делаю импорт таблицы в dbf Харбора и вот тут в поле TimeLog надо писать время с учётом часового пояса.
|
|
|
|
| постоянный участник
|
Пост N: 1590
Зарегистрирован: 09.10.06
|
|
Отправлено: 01.03.21 17:28. Заголовок: Andrey пишет: Далее..
Andrey пишет: цитата: | Далее делаю импорт таблицы |
| Если импорт выполнен с использованием sddpg (Postgre SQL Database Driver) то поле timestamp with time zone импортируется в виде строки в 26 символов и эту строку просто нужно правильно интерпретировать.
|
|
|
|
| Администратор
|
Пост N: 4003
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.03.21 17:32. Заголовок: hb_TSToUTC переводит..
hb_TSToUTC переводит локальное время в utc. Нам надо наоборот. Такой функции нет, но обойдемся и без нее делаем так: пусть dt - время в utc тогда dt + (dt - hb_tstoutc(dt)) - локальное время
|
|
|
|
| постоянный участник
|
Пост N: 6899
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.03.21 17:45. Заголовок: Да, при импорте полу..
Да, при импорте получается строка из которой выделяю время. Получается текстовая строка. А как дальше её преобразовать с учётом часового пояса ? Допустим строка cTime := "07:39:56" А дальше пока не придумал как сделать...
|
|
|
|
| постоянный участник
|
Пост N: 1591
Зарегистрирован: 09.10.06
|
|
Отправлено: 02.03.21 00:31. Заголовок: Andrey пишет: Допус..
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
|
|
|
|
|
| постоянный участник
|
Пост N: 6900
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.03.21 02:48. Заголовок: Петр пишет: Работат..
Петр пишет: цитата: | Работать нужно не с time, а с timestamp Как-то так |
| Спасибо БОЛЬШОЕ !
|
|
|
|
| Администратор
|
Пост N: 4004
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.03.21 08:36. Заголовок: Если переводить utc ..
Если переводить utc время в локальное через hb_utcoffset, то лучше этой функции передавать параметр, иначе для часового пояса, в котором летнее и зимнее время различны, результат может искажаться на час пусть dt - дата+время в utc тогда перевод в локальное время можно сделать так dt + (dt - hb_tstoutc(dt)) или так: dt + hb_UTCOffset(dt)/(3600*24)
|
|
|
|
| постоянный участник
|
Пост N: 6901
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.03.21 10:10. Заголовок: Спасибо БОЛЬШОЕ Pash..
Спасибо БОЛЬШОЕ Pasha !
|
|
|
|
| постоянный участник
|
Пост N: 1592
Зарегистрирован: 09.10.06
|
|
Отправлено: 02.03.21 11:39. Заголовок: Нюансы, конечно, ест..
Нюансы, конечно, есть. И в идеале Андрею лучше бы было использовать возможности сервера для преобразования дат. У pg отличная документация, в т.ч. и на русском. Но и все остальное нужно знать - что такое временные зоны, какие возможности в работу с временем и датами Harbour, нужно учитывать где установлен и как настроен SQL сервер, какой тип полей используется в БД. А без понимания всего этого можно и накосячить Андрею рекомендую прочитать, может подтолкнет к правильным выводам - Как в PostgreSQL привести дату TIMESTAMP WITH TIME ZONE к часовому поясу
|
|
|
|
| постоянный участник
|
Пост N: 6902
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.03.21 22:49. Заголовок: Петр Спасибо БОЛЬШОЕ..
Петр Спасибо БОЛЬШОЕ !
|
|
|
|