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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

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

Сообщение 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}
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

resident писал(а):NowUTC

Это текущее UTC, а я про другую временную зону спрашиваю. Скажем сколько сейчас в Лондоне, чтобы вернула.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

Sharfik писал(а):Это текущее UTC, а я про другую временную зону спрашиваю

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

UTC + 1 час
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

Надо еще учитывать зимнее/летнее время разных стран, так что это не столь тривиально.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

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

Это да, мы даже не знаем, куда у Анатолича завтра тараканы побегут. :)
Такая информация приходит с обновлениями Винды и заранее неизвестна.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Коллеги, ознакомьтесь пожалуйста с этим материалом: http://sirserge.altai.info/articles/?id=46
Там много что о зонах написано.
И, в том числе, добавлю: до сих пор в базе Олсона нет последнего перехода Омска - т.е. даже в этом глобальном хранилище отнюдь не всё правильно.
А уж про винду. Гм. Впрочем, в статейке всё сказано.
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

а почему нельзя синхронизировать время с NTP-сервера ? ) Может же случиться и так , что время у пользователя будет настроено неправильно , и если отсчет брать от локального времени могут возникнуть ошибки :roll:
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

SSerge писал(а):Коллеги, ознакомьтесь пожалуйста с этим материалом

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

А я всё удивлялся: зачем там то, зачем это, если они ничего не делают толкового. Теперь всё понятно. :)
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 839
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

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

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

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

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

буду дальше разбираться с реестром значит.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Как я понял нужно тогда вести свою БД по временным зонам
ну..у там есть база. Согласно вики (или на форуме прочитал): можно заглянуть в прошлое :lol:
п.с.
чем база то не нравиться? По принципу: всё свое ношу с собой :)
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Sharfik писал(а):буду дальше разбираться с реестром значит


Не стоит. Он совершенно негоден для этого.
Самое imho рациональное - водрузить mySQL, вкачать в него зонные базы и переводы делать SQL запросами.
Аватара пользователя
AlphaBlend
постоялец
Сообщения: 207
Зарегистрирован: 22.05.2016 09:13:10

Сообщение AlphaBlend »

Получить , например , текущее время в Вашингтоне )

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

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

Эта штука работает корректно , если Ваш сервер синхронизирует свое время ! ;-)
Вложения
структура  таблички с временными зонами
структура таблички с временными зонами
ttable_f.png (9.02 КБ) 38765 просмотров
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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


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