Страница 1 из 2
Как получить время города N?
Добавлено: 02.07.2016 18:44:20
Sharfik
В laz есть готовые решения по получению времени какой то временной зоны? Текущее, а не теоретическое исходя из списка зон, как ниже.
Можно получить через реест, но я пока не понимаю как вытянуть числовое значение оттуда. И это очередная привязка к Windows.
Код: Выделить всё
{$IFDEF WINDOWS}
cbTimeList.Clear;
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.LazyWrite := false;
r:=reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones');
if r and reg.HasSubKeys then
begin
ts := TStringList.Create;
reg.GetKeyNames(ts);
reg.CloseKey;
for i := 0 to ts.Count -1 do
begin
reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\' + ts.Strings[i], false);
//sTmp:=ts.Strings[i]+' - '+reg.ReadString('Display')+' - '+reg.ReadString('Std')+' - '+reg.ReadString('Dlt');
sTmp:=reg.ReadString('Display');
sTmp:=WinCPToUTF8(sTmp);
cbTimeList.Items.Add(sTmp);
reg.CloseKey;
end;
ts.Free;
end
else
reg.CloseKey;
reg.free;
{$ELSE}
cbTimeList.Clear;
{$ENDIF}
Re: Как получить время города N?
Добавлено: 02.07.2016 19:43:05
resident
Re: Как получить время города N?
Добавлено: 02.07.2016 19:56:01
Sharfik
resident писал(а):NowUTC
Это текущее UTC, а я про другую временную зону спрашиваю. Скажем сколько сейчас в Лондоне, чтобы вернула.
Re: Как получить время города N?
Добавлено: 02.07.2016 20:25:14
resident
Sharfik писал(а):Это текущее UTC, а я про другую временную зону спрашиваю
Дык прибавить соответствующую дельту другой временной зоны. Или я что-то не пойму.
Sharfik писал(а):Скажем сколько сейчас в Лондоне, чтобы вернула.
UTC + 1 час
Re: Как получить время города N?
Добавлено: 02.07.2016 21:24:33
Снег Север
resident писал(а):Дык прибавить соответствующую дельту другой временной зоны.
Надо еще учитывать зимнее/летнее время разных стран, так что это не столь тривиально.
Re: Как получить время города N?
Добавлено: 02.07.2016 21:37:11
resident
Снег Север писал(а):Надо еще учитывать зимнее/летнее время разных стран, так что это не столь тривиально.
Это да, мы даже не знаем, куда у Анатолича завтра тараканы побегут.
Такая информация приходит с обновлениями Винды и заранее неизвестна.
Re: Как получить время города N?
Добавлено: 02.07.2016 22:19:40
pupsik
Re: Как получить время города N?
Добавлено: 03.07.2016 02:49:52
SSerge
Коллеги, ознакомьтесь пожалуйста с этим материалом:
http://sirserge.altai.info/articles/?id=46Там много что о зонах написано.
И, в том числе, добавлю: до сих пор в базе Олсона нет последнего перехода Омска - т.е. даже в этом глобальном хранилище отнюдь не всё правильно.
А уж про винду. Гм. Впрочем, в статейке всё сказано.
Re: Как получить время города N?
Добавлено: 03.07.2016 07:19:46
AlphaBlend
а почему нельзя синхронизировать время с NTP-сервера ? ) Может же случиться и так , что время у пользователя будет настроено неправильно , и если отсчет брать от локального времени могут возникнуть ошибки

Re: Как получить время города N?
Добавлено: 03.07.2016 09:50:45
resident
SSerge писал(а):Коллеги, ознакомьтесь пожалуйста с этим материалом
Во FreePascal касающееся работы с датами и временем содержится в unitах SysUtils и DateUtils. Количество функций впечатляет, однако при внимательном изучении можно легко придти к мнению, что многие из них бесполезны целиком и полностью, а многие на самом деле будут выдавать далеко не то, что от них ожидается.
А я всё удивлялся: зачем там то, зачем это, если они ничего не делают толкового. Теперь всё понятно.

Re: Как получить время города N?
Добавлено: 04.07.2016 12:38:13
Sharfik
Все, пора валить. Где ближайший монастырь для разочаровавшихся программистов? За ссылку спасибо

AlphaBlend писал(а):а почему нельзя синхронизировать время с NTP-сервера ? )
Нерентабельно.
pupsik писал(а):http://wiki.freepascal.org/PascalTZ не подойдет?
Как я понял нужно тогда вести свою БД по временным зонам. Тогда зачем нужна ОС? Хотя, если припрет переходить на linux то подойдет. Пока с Windows разберусь.
буду дальше разбираться с реестром значит.
Re: Как получить время города N?
Добавлено: 04.07.2016 15:31:05
pupsik
Как я понял нужно тогда вести свою БД по временным зонам
ну..у там есть база. Согласно вики (или на форуме прочитал): можно заглянуть в прошлое
п.с.
чем база то не нравиться? По принципу: всё свое ношу с собой

Re: Как получить время города N?
Добавлено: 04.07.2016 15:34:02
SSerge
Sharfik писал(а):буду дальше разбираться с реестром значит
Не стоит. Он совершенно негоден для этого.
Самое imho рациональное - водрузить mySQL, вкачать в него зонные базы и переводы делать SQL запросами.
Re: Как получить время города N?
Добавлено: 04.07.2016 17:52:53
AlphaBlend
Получить , например , текущее время в Вашингтоне )
select interval `timezone_spring` hour + utc_timestamp() FROM `timezones` WHERE `city` = 'ctWashington' ;После получения TDatetime можно как угодно ее разобрать и сделать все ,что угодно ( у клиента ) .
Эта штука работает корректно , если Ваш сервер синхронизирует свое время !
Re: Как получить время города N?
Добавлено: 05.07.2016 02:03:58
SSerge
AlphaBlend писал(а):Эта штука работает корректно , если Ваш сервер синхронизирует свое время !

Именно эта штука работает некорректно, если переводить требуется время, не имеющее отношения к текущему.
Делать запросы к недокументированным структурам - отнюдь не самый лучший выбор. Тогда уж надо выдирать из таблицы и правила перевода. И сотворять аналог freepascalTZ верхом на mySQL.
