реклама на сайте
подробности

 
 
> time.h ARMCC
Pridnya
сообщение Dec 5 2016, 06:49
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Здравствуйте!
Как учитывается временная зона в стандартной библиотеке времени time.h?
Все что нашел в файле time.h - упоминание в функции strftime()
Цитата
%Z is replaced by the timezone name or abbreviation, or by no characters if no time zone is determinable.

Попробовал все, что можно вывести, выводит все, кроме временной зоны:
Цитата
time_t rawtime = 1480685759; // Fri, 02 Dec 2016 13:35:59 GMT
struct tm * timeinfo;
timeinfo = (struct tm*)localtime(&rawtime); // Convert time_t to tm as UTC time
char buffer [80];

strftime (buffer,80,"%I:%M%p",timeinfo);
puts (buffer); // 01:35PM

strftime (buffer,80,"%H:%M:%S%p",timeinfo);
puts (buffer); // 13:35:59PM

strftime (buffer,80,"%H:%M:%S",timeinfo);
puts (buffer); // 13:35:59

strftime (buffer,80,"%d.%m.%y",timeinfo);
puts (buffer); // 02.12.16

strftime (buffer,80,"%a_%A",timeinfo);
puts (buffer); // Fri_Friday

strftime (buffer,80,"%b_%B",timeinfo);
puts (buffer); // Dec_December

strftime (buffer,80,"%c",timeinfo);
puts (buffer); // 02 Dec 2016 13:35:59

strftime (buffer,80,"%j",timeinfo);
puts (buffer); // 337 (day of the year as a decimal number (001-366))

strftime (buffer,80,"%W",timeinfo);
puts (buffer); // 48 (the week number of the year (Monday as the first day))

strftime (buffer,80,"%x",timeinfo);
puts (buffer); // 02 Dec 2016

strftime (buffer,80,"%X",timeinfo);
puts (buffer); // 13:35:59

strftime (buffer,80,"%y",timeinfo);
puts (buffer); // 16 (year without century).

strftime (buffer,80,"%Y",timeinfo);
puts (buffer); // 2016 (year with century)

strftime (buffer,80,"%Z",timeinfo);
puts (buffer); // ???

Не знаю, как её задавать. Ведь с систем синхронизации будет время UTC+0, а у меня локальное UTC+3. Т.е. где-то должна быть временная зона.

Посмотрел у других - для PIC24 (компилятор XC16) в файле time.h есть переменная time_zone:
Код
extern int    time_zone;    /* minutes WESTWARD of Greenwich */
                /* this value defaults to 0 since with
                   operating systems like MS-DOS there is
                   no time zone information available */


Сообщение отредактировал Pridnya - Dec 5 2016, 06:52
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Dec 6 2016, 11:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Я написал "типа этого". Специально проверял по разным. У меня всё работает. Уже 2 года выпускают изделие.
Вообще непонятно как там можно ошибиться.
Когда будете писать, контролируйте при GMT 0. А TimeZone это просто смещение. Ошибиться в операции сложения... ну я не знаю. ))
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 6 2016, 11:50
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(SasaVitebsk @ Dec 6 2016, 14:24) *
Я написал "типа этого". Специально проверял по разным. У меня всё работает. Уже 2 года выпускают изделие.
Вообще непонятно как там можно ошибиться.
Когда будете писать, контролируйте при GMT 0. А TimeZone это просто смещение. Ошибиться в операции сложения... ну я не знаю. ))

Я скриншоты привел для того, чтобы вы в своем онлайн-калькуляторе поискали, почему он пишет, что у меня на компьютере время такое-то, а оно на час отличается. У вас, наверное, ошибка, ведь часовые пояса у меня и у вас совпадают +3. Время на моем компьютере совпадает с "временем сервера", а не с "временем на вашем компьютере". rolleyes.gif Или я чего-то не понял?

Как прибавить три часа (3*3600) к UnixTime я знаю.

Сообщение отредактировал Pridnya - Dec 6 2016, 11:52
Go to the top of the page
 
+Quote Post
Lagman
сообщение Dec 6 2016, 12:42
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(Pridnya @ Dec 6 2016, 14:50) *
Я скриншоты привел для того, чтобы вы в своем онлайн-калькуляторе поискали, почему он пишет, что у меня на компьютере время такое-то, а оно на час отличается.

У вас написано, что часовой пояс у вашего компьютера - Калининградское время (зима), а это как раз -1 час т.е. ваш winxp уже давно не знает правильного часового пояса, поищите в инете как это поправить через реестр.
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Dec 6 2016, 19:12
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(Lagman @ Dec 6 2016, 15:42) *
У вас написано, что часовой пояс у вашего компьютера - Калининградское время (зима), а это как раз -1 час т.е. ваш winxp уже давно не знает правильного часового пояса, поищите в инете как это поправить через реестр.

Спасибо! Сделал все как здесь описано, теперь время с онлайн-калькулятором совпадает (только секунды не синхронизированы, но это уже другой вопрос).
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jan 23 2017, 17:30
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Извините, то есть стандартизированного и документированного для Кейла пути работы с летним-зимним временем нет? И каждый свое делает как Бог на душу положит?
Грустно как-то. Нужно добавить в сорцы работу с летним/зимним- думал что лыжи не едут, а оказывается лыж просто нет совсем.

Ну хорошо, врукопашную.
А кто как даты перевода задает?
я как-то думал, что можно еще и дефолт сделать(последняя суббота марта...), но, разброд и шатание не поддаются алгоритмизации, понял, что лучше всегда требовать точно задать дату и время перевода, потому как дефолт-понятие растяжимое и у каждого он свой.

И, получается, что лучше просто иметь в конфиге startDateTime и endDateTime.

Или есть более изящный путь, без обновления этого конфига раз в год, определить какое сейчас здесь время, летнее или нелетнее?
Например, указать сайт, показывающий локальное время для данного прибора, и от него уже отталкиваться при определении времени? Или что-то подобное?

А еще: я, конечно, в школе учил географию, но как-то не думал, что переход на летнее время может быть в конце календарного года, а на зимнее- в начале года. Интересно, многие ли разработчики программ про это думали и учитывали в сорцах sm.gif

PS вот что бывает когда десятки лет работаешь в UTC, и вдруг надо в что-то местное переводить... Столько нового узнаешь об окружающем мире....
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 23 2017, 18:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Ruslan1 @ Jan 23 2017, 20:30) *
А еще: я, конечно, в школе учил географию, но как-то не думал, что переход на летнее время может быть в конце календарного года, а на зимнее- в начале года. Интересно, многие ли разработчики программ про это думали и учитывали в сорцах sm.gif

Делал в своё время.
По памяти: у нас были следующие варианты задания в конфиге диапазона летнего времени:
1.Фиксированное число/месяц.
2.Последняя суббота N-го месяца.
3.Первая суббота N-го месяца (хотя уже не помню - возможно можно было выбрать номер субботы определённого месяца).
Всё учитывали.
И перевод может быть на не целое число часов (полчаса например).
Да и не переводил вобщем-то реально ничего (RTC). Часы реального времени шли всегда в линейном времени.
А уже если нужно было сезонное время, я определял - попадает-ли данная дата в диапазон летнего времени и включен-ли перевод? Если да - прибавлял к линейному времени смещение.
А вообще - перевод часов в системе реального времени, когда многое завязано на часы - это ОЧЕНЬ нетривиальная задача. Очень много проблем было с этим связано.
Особенно - когда на эти переводы ещё накладываются корректировки времени по интерфейсам связи и корректировки хода часов с ФАПЧ.
Служба реального времени - была одной из наиболее сложных частей ПО.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jan 23 2017, 19:52
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



jcxz, спасибо!
тоже думаю про похожее, так как хороших вариантов не так уж много.

Интересный вопрос- конфигуратор, в какой форме-формате задавать величины
как задать так чтобы покрыть все хотелки, не тупик в развитии, и при этом чтоб простой парсинг был.
Разглядывал как переменная TZ сделана, это кажется самый универсальный путь. Там два варианта стандартизировано, через день года(абсолютная дата) и через недели (для тривиальных ситуаций). Вкусность в том что это уже документировано, а не новый велосипед.
Осталось выделить нужную часть для использования в конфигураторе, чтобы все не делать. Думаю для начала только кусок с "day d of week w of month m" реализовать, потом разовью если нужно будет.

То есть для примера ниже все уже задокументировано, и не велосипед. Может, и исходники tzset() пригодятся sm.gif
Цитата
Here are some example TZ values, including the appropriate Daylight Saving Time and its dates of applicability. In North American Eastern Standard Time (EST) and Eastern Daylight Time (EDT), the normal offset from UTC is 5 hours; since this is west of the prime meridian, the sign is positive. Summer time begins on March’s second Sunday at 2:00am, and ends on November’s first Sunday at 2:00am.

EST+5EDT,M3.2.0/2,M11.1.0/2

Here is an example for New Zealand, where the standard time (NZST) is hours ahead of UTC, and daylight saving time (NZDT), 13 hours ahead of UTC, runs from the first Sunday in October to the third in March, and the changeovers happen at the default time of 02:00:00:

TZ="NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"


Про часы и время- у меня тоже время всегда в UTC, коррекция на таймзону только в команду чтения локального времени вставлена. Теперь буду там же еще и зиму-лето вставлять. Лично я хорошо понимаю насколько это проблематично, особенно если неразрывность данных нужна и возможна передача в другие системы. Но для локального использования может быть и неплохо иногда.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Pridnya   time.h ARMCC   Dec 5 2016, 06:49
- - KnightIgor   Цитата(Pridnya @ Dec 5 2016, 08:49) Уже ...   Dec 5 2016, 08:58
|- - Pridnya   Цитата(KnightIgor @ Dec 5 2016, 11:58) Уж...   Dec 5 2016, 09:15
- - esaulenka   Вбил в поиск по хелпу кейла слово "timezone...   Dec 5 2016, 14:13
|- - Pridnya   Цитата(esaulenka @ Dec 5 2016, 17:13) Вби...   Dec 5 2016, 19:06
|- - Alechek   Цитата(Pridnya @ Dec 6 2016, 00:06) Получ...   Dec 6 2016, 04:14
|- - Pridnya   Цитата(Alechek @ Dec 6 2016, 07:14) А Вы ...   Dec 6 2016, 05:49
- - SasaVitebsk   Я полностью написал свою библиотеку. Там мизер, по...   Dec 6 2016, 09:04
|- - Pridnya   Цитата(SasaVitebsk @ Dec 6 2016, 12:04) Я...   Dec 6 2016, 10:53
|- - SasaVitebsk   Цитата(Ruslan1 @ Jan 23 2017, 20:30) Ну х...   Jan 24 2017, 10:44
- - aiwa   Цитата(jcxz @ Jan 23 2017, 20:00) По памя...   Jan 24 2017, 12:13
|- - Ruslan1   Цитата(aiwa @ Jan 24 2017, 14:03) Добавлю...   Jan 24 2017, 12:20
||- - KnightIgor   Цитата(Ruslan1 @ Jan 24 2017, 14:20) Для ...   Jan 25 2017, 17:44
||- - Сергей Борщ   QUOTE (KnightIgor @ Jan 25 2017, 19:44) Х...   Jan 25 2017, 17:55
||- - Ruslan1   Цитата(Сергей Борщ @ Jan 25 2017, 19:55) ...   Jan 25 2017, 19:00
|- - jcxz   Цитата(aiwa @ Jan 24 2017, 15:13) Добавлю...   Jan 24 2017, 13:04
- - aiwa   Цитата(Ruslan1 @ Jan 24 2017, 14:20) мне ...   Jan 24 2017, 12:26
- - aiwa   Цитата(jcxz @ Jan 24 2017, 15:04) Не помн...   Jan 24 2017, 13:37


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 20:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016