Страница 1 из 2

Как получить время города N?

СообщениеДобавлено: 02.07.2016 19: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 20:43:05
resident

Re: Как получить время города N?

СообщениеДобавлено: 02.07.2016 20:56:01
Sharfik
resident писал(а):NowUTC

Это текущее UTC, а я про другую временную зону спрашиваю. Скажем сколько сейчас в Лондоне, чтобы вернула.

Re: Как получить время города N?

СообщениеДобавлено: 02.07.2016 21:25:14
resident
Sharfik писал(а):Это текущее UTC, а я про другую временную зону спрашиваю

Дык прибавить соответствующую дельту другой временной зоны. Или я что-то не пойму.
Sharfik писал(а):Скажем сколько сейчас в Лондоне, чтобы вернула.

UTC + 1 час

Re: Как получить время города N?

СообщениеДобавлено: 02.07.2016 22:24:33
Снег Север
resident писал(а):Дык прибавить соответствующую дельту другой временной зоны.

Надо еще учитывать зимнее/летнее время разных стран, так что это не столь тривиально.

Re: Как получить время города N?

СообщениеДобавлено: 02.07.2016 22:37:11
resident
Снег Север писал(а):Надо еще учитывать зимнее/летнее время разных стран, так что это не столь тривиально.

Это да, мы даже не знаем, куда у Анатолича завтра тараканы побегут. :)
Такая информация приходит с обновлениями Винды и заранее неизвестна.

Re: Как получить время города N?

СообщениеДобавлено: 02.07.2016 23:19:40
pupsik

Re: Как получить время города N?

СообщениеДобавлено: 03.07.2016 03:49:52
SSerge
Коллеги, ознакомьтесь пожалуйста с этим материалом: http://sirserge.altai.info/articles/?id=46
Там много что о зонах написано.
И, в том числе, добавлю: до сих пор в базе Олсона нет последнего перехода Омска - т.е. даже в этом глобальном хранилище отнюдь не всё правильно.
А уж про винду. Гм. Впрочем, в статейке всё сказано.

Re: Как получить время города N?

СообщениеДобавлено: 03.07.2016 08:19:46
AlphaBlend
а почему нельзя синхронизировать время с NTP-сервера ? ) Может же случиться и так , что время у пользователя будет настроено неправильно , и если отсчет брать от локального времени могут возникнуть ошибки :roll:

Re: Как получить время города N?

СообщениеДобавлено: 03.07.2016 10:50:45
resident
SSerge писал(а):Коллеги, ознакомьтесь пожалуйста с этим материалом

Во FreePascal касающееся работы с датами и временем содержится в unitах SysUtils и DateUtils. Количество функций впечатляет, однако при внимательном изучении можно легко придти к мнению, что многие из них бесполезны целиком и полностью, а многие на самом деле будут выдавать далеко не то, что от них ожидается.

А я всё удивлялся: зачем там то, зачем это, если они ничего не делают толкового. Теперь всё понятно. :)

Re: Как получить время города N?

СообщениеДобавлено: 04.07.2016 13:38:13
Sharfik
SSerge писал(а):Коллеги, ознакомьтесь пожалуйста с этим материалом: http://sirserge.altai.info/articles/?id=46

Все, пора валить. Где ближайший монастырь для разочаровавшихся программистов? За ссылку спасибо :)
AlphaBlend писал(а):а почему нельзя синхронизировать время с NTP-сервера ? )

Нерентабельно.
pupsik писал(а):http://wiki.freepascal.org/PascalTZ не подойдет?

Как я понял нужно тогда вести свою БД по временным зонам. Тогда зачем нужна ОС? Хотя, если припрет переходить на linux то подойдет. Пока с Windows разберусь.

буду дальше разбираться с реестром значит.

Re: Как получить время города N?

СообщениеДобавлено: 04.07.2016 16:31:05
pupsik
Как я понял нужно тогда вести свою БД по временным зонам
ну..у там есть база. Согласно вики (или на форуме прочитал): можно заглянуть в прошлое :lol:
п.с.
чем база то не нравиться? По принципу: всё свое ношу с собой :)

Re: Как получить время города N?

СообщениеДобавлено: 04.07.2016 16:34:02
SSerge
Sharfik писал(а):буду дальше разбираться с реестром значит


Не стоит. Он совершенно негоден для этого.
Самое imho рациональное - водрузить mySQL, вкачать в него зонные базы и переводы делать SQL запросами.

Re: Как получить время города N?

СообщениеДобавлено: 04.07.2016 18:52:53
AlphaBlend
Получить , например , текущее время в Вашингтоне )

select interval `timezone_spring` hour + utc_timestamp() FROM `timezones` WHERE `city` = 'ctWashington' ;

После получения TDatetime можно как угодно ее разобрать и сделать все ,что угодно ( у клиента ) .

Эта штука работает корректно , если Ваш сервер синхронизирует свое время ! ;-)

Re: Как получить время города N?

СообщениеДобавлено: 05.07.2016 03:03:58
SSerge
AlphaBlend писал(а):Эта штука работает корректно , если Ваш сервер синхронизирует свое время ! ;-)


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