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

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

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

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

Сообщение Sharfik » 02.07.2016 19:44:20

В 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}
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

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

Сообщение resident » 02.07.2016 20:43:05

resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение Sharfik » 02.07.2016 20:56:01

resident писал(а):NowUTC

Это текущее UTC, а я про другую временную зону спрашиваю. Скажем сколько сейчас в Лондоне, чтобы вернула.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

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

Сообщение resident » 02.07.2016 21:25:14

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

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

UTC + 1 час
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение Снег Север » 02.07.2016 22:24:33

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

Надо еще учитывать зимнее/летнее время разных стран, так что это не столь тривиально.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение resident » 02.07.2016 22:37:11

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

Это да, мы даже не знаем, куда у Анатолича завтра тараканы побегут. :)
Такая информация приходит с обновлениями Винды и заранее неизвестна.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение pupsik » 02.07.2016 23:19:40

pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение SSerge » 03.07.2016 03:49:52

Коллеги, ознакомьтесь пожалуйста с этим материалом: http://sirserge.altai.info/articles/?id=46
Там много что о зонах написано.
И, в том числе, добавлю: до сих пор в базе Олсона нет последнего перехода Омска - т.е. даже в этом глобальном хранилище отнюдь не всё правильно.
А уж про винду. Гм. Впрочем, в статейке всё сказано.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение AlphaBlend » 03.07.2016 08:19:46

а почему нельзя синхронизировать время с NTP-сервера ? ) Может же случиться и так , что время у пользователя будет настроено неправильно , и если отсчет брать от локального времени могут возникнуть ошибки :roll:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение resident » 03.07.2016 10:50:45

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

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

А я всё удивлялся: зачем там то, зачем это, если они ничего не делают толкового. Теперь всё понятно. :)
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

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

Сообщение Sharfik » 04.07.2016 13:38:13

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

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

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

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

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

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

Сообщение pupsik » 04.07.2016 16:31:05

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

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

Сообщение SSerge » 04.07.2016 16:34:02

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


Не стоит. Он совершенно негоден для этого.
Самое imho рациональное - водрузить mySQL, вкачать в него зонные базы и переводы делать SQL запросами.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

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

Сообщение AlphaBlend » 04.07.2016 18:52:53

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

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

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

Эта штука работает корректно , если Ваш сервер синхронизирует свое время ! ;-)
Вложения
ttable_f.png
структура таблички с временными зонами
ttable_f.png (9.02 КБ) Просмотров: 26684
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

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

Сообщение SSerge » 05.07.2016 03:03:58

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


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

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

Рейтинг@Mail.ru