Перейти к содержанию
    

Как можно подобные записи интерпретировать к смещение (+3) ко времени?

Это какой- то стандарт таймзоны. Но нигде не нашел соответствия записи конкретно смещению.

Кто может сталкивался? Нужно соответствие текста к смещению временному.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в google искать не пробовали? Первые же ссылки на таймзоны будут, прямо с указанием географического положения. Это в служебных файлах. Легко в файле находится GMT0BST,M3.5.0/1,M10.5.0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Метценгерштейн said:

Как можно подобные записи интерпретировать . . . .

Я использовал в IAR для инициализации сист. переменной, которая далее используется для настройки подсистемы времени UTC

(значение этой переменной "разбирается" для вычисления смещения от UTC и смещения зима-лето DT)

Кажется "time.h", если порыться в системных h, есть и intrinsic-функции IAR, видно как оно парсится.

см. IAR

Conversion functions

asctime Converts a tm object to a string representation
ctime Converts a time_t  object to a string representation
gmtime Converts from a time_t object to tm object
localtime Converts  from  current time to  local time
strftime Converts a tm object into a specified format
mktime

Converts from a tm object to a time_t object 

 

 

нырнул "в прошлое", смотрите у IAR, и "дано вам будет".

xtime.h, xtinfo.h

и функции ейные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Можете посмотреть QNX, там более похоже на Ваш вариант:  EST5EDT4,M3.2.0/02:00:00,M11.1.0/02:00:00  

stdoffset[dst[offset][,start[/time],end[/time]]]

IAR MSP430 getzone.c   интерпретация подобных строк

/*******************
 * This is the default implementation of the __getzone. It returns
 * the current time-zone, i.e. UTC.
 *
 * The return value should be a string on the following form:
 *
 * :[XXX[:YYY[:NNN[:DST[:DST ...]]]]]
 *
 * Where XXX is the standard time-zone name, YYY is the daylight
 * savings time-zone name, NNN is the time zone offset, and the DSTs
 * are the daylight savings time rules. Daylight savings time will add
 * one hour to the normal time. (The names are only used in the 'Z'
 * formatter in the strftime library function.)
 *
 * The time zone offset NNN is specified as a number relative to UTC,
 * possibly negative (east is positive), on the format HHMM, where HH
 * is hours and MM is minutes.
 *
 * The DSTs specifes a set of rules for how daylight savings time is
 * applied. The rules must be sorted in increasing date order starting
 * from the earliest date. The first rule for a specific year will
 * enable DST, the next will disable it, and so on. Each rule is on
 * the following form:
 *
 *   [(YYYY)]MMDD[HH][-W|+W]
 *
 *    (YYYY) is the first year the daylight savings rule was applied.
 *       It is optional. If not specified it will default to the same
 *       year as the previous rule or zero if no previous rule.
 *    MM is the month number (1-12).  
 *    DD is the day of the month (1-31).  
 *    HH is the hour number in a 24-hour day (optional, defaults to
 *       0).  
 *    +/-W specifies the day of the week the rule takes effect (where
 *       Sunday = 0, Monday = 1, etc). +W means that the rule applies
 *       to the first such day on or after the specified date and -W
 *       strictly before the date. If this is not specified, the rule
 *       will take effect on the exact date, regardless of the day of
 *       the week.
 *
 * On the northern hemisphere the DST rules normally comes in pairs, a
 * start, Aprilish, and an end, Octoberish. On the southern hemisphere
 * one normally has to use three rules: enabling DST from start of
 * year, disabling it in Aprilish, and then enabling it again in
 * Octoberish.
 *
 * Example:
 *
 *   :GMT:GMT+1:0060:(1990)040102-0:100102-0
 *
 *   Here, the time zone is GMT and under daylight savings time the
 *   time zone is named GMT+1. The time zone offset is 0060, i.e. 60
 *   minutes from UTC. As of the year 1990, daylight savings time
 *   started on the Sunday before (but not on) 1:st of April at 2am
 *   and ends on the first Sunday before (but not on) the first of
 *   October.
 *
 *   :GMT+10:GMT+11:0900:(1990)010100-0:040102-0:100102-0
 *
 *   Tasmania is on UTC+10 hours, with daylight savings time from
 *   first Sunday in October until first Sunday in April. Note, the
 *   first DST rule is for enabling from start of the year.
 *
 ********************/

#include <yfuns.h>

_STD_BEGIN

char const * __getzone()
{
  return ":";
}

_STD_END

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, mdmitry said:

А в google искать не пробовали?

разумеется, искал. Кроме биллеберды, или что это какой- то годод (Абу- Даби), инфы нет. И что мне этот Абу -Даби дает? Сколько смещение в цифрах? 

13 hours ago, k155la3 said:

нырнул "в прошлое", смотрите у IAR, и "дано вам будет".

Тут бы хорошо иметь некий массив текстовый, с этими строками, где сразу время брать вторым параметром. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Метценгерштейн said:

. . . Тут бы хорошо иметь некий массив текстовый, с этими строками, где сразу время брать вторым параметром. 

У меня зон было всего 5-6, таблица была прописана в коде.

Если надо всемирную, смотрите здесь www.iana.org/time-zones  + ftp.iana.org + wiki (tz database) + git . . . 

+ см. tz-link.htm   Эта база ведется централизовано, обновляется ежегодно.

image.png.7bf5c9d51bc0eba0cfa60c061888da8d.png

 

tz-link.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, Метценгерштейн said:

. . . Тут бы хорошо иметь некий массив текстовый, с этими строками, где сразу время брать вторым параметром. 

ps Вообще, если IAR, то вариант реализации времени:

1. Установить в системе требуемую таймзону и ее "правила" (смещение и усливия перевода зима-лето) - строка

2. Запустить счетчик секунд UTC.

3. Используя (2) применять ф-ии localtime() и gmtime() итд

Основной/"боевой" счет времени идет по бинарному UTC. Задержки, сравнения итп.

Все прикладные "задания" из ASCII пересчитываются на UTC  и работают в bin.

Правильное смещение в таймзоне относительно UTC и автоматический учет DST обеспечивает "внутренняя кухня" в DLIB на базе (1).

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задача простая- получить из сохраненных настроек таймзону, и считать с сервера время. Прибавить к нему.

Сама таймзона может быть любая стандартная.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Retrieves the character string representation of the time zone name or the daylight standard time zone name (DST).

 errno_t _get_tzname( size_t* pReturnValue, char* timeZoneName, size_t sizeInBytes, int index  );

системная переменная _tzname
 

В MSVC есть такое, не пользовался.

    size_t s;
    char tzname[100];
    _get_tzname( &s, tzname, sizeof(tzname), 0 );
    printf( "_tzname[0] = %s\n", tzname );

Смотря какая платформа, все по-разному может быть. Смотрите в компиляторе-среде файлы *time*.* и структуры tm.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/27/2020 at 5:09 PM, Метценгерштейн said:

Но нигде не нашел соответствия записи конкретно смещению.

Кто может сталкивался? Нужно соответствие текста к смещению временному.

не очень понятно, о какой записи и каком смещении речь.  www.timeanddate.com

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, Метценгерштейн said:

разумеется, искал. Кроме биллеберды, или что это какой- то годод (Абу- Даби), инфы нет. И что мне этот Абу -Даби дает? Сколько смещение в цифрах? 

Тут бы хорошо иметь некий массив текстовый, с этими строками, где сразу время брать вторым параметром. 

 

Из nvosx:

Europe/Belfast=GMT0BST,M3.5.0/1,M10.5.0

Пример из TZ5

При таком поиске не получается Абу- Даби :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 hours ago, Obam said:

До тла разжёвано: ftp://ftp.iana.org/tz/theory.html Не?

может и разжевано, но проще нет варианта, чем парсить это всё.

22 hours ago, mdmitry said:

При таком поиске не получается Абу- Даби :)

 Europe/Belfast получается. И сколько это смещение? Мне не интересно, что за город там, мне надо цифры.

On 3/28/2020 at 9:32 PM, k155la3 said:

не очень понятно, о какой записи и каком смещении речь. 

Примерно об этом. Если такая строка как у меня, то мне надо знать, сколько прибавить ко времени с сервера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То, с чем я работал, платформо-зависимое. Давно было, собирал тех.док., бумажное было, если найду то что Вам надо. У меня был другой формат.

#define TZ_GMT     ":GMT+0:GMT+0:0000"
#define TZ_UA_1D   ":GMT+2:GMT+3:0200:(1996)033103-0:103104-0"
#define TZ_UA_2N   ":GMT+2:GMT+2:0200"
#define TZ_MLD_1D  ":GMT+2:GMT+3:0200:(1996)033103-0:103104-0"

Тот что подходит Вам, дано в ссылке выше по QNX, в том числе формат и хелп и пример. Возможно это в рамках стандарта POSIX (см. хелп по ссылке.)

Вот по Вашей строке, то что сейчас понял (не уверен)

QNX
stdoffset[dst[offset][,start[/time],end[/time]]]
-------------------------------
  
	GMT0BST,M3.5.0/1,M10.5.0

	stdoffset		GMT   база
		[dst		0		применение зима/лето
		[offset]	BST		смещение в зоне (кодировка)
			[,
		start[  	M3.5.0  начало применения для DST
			/
		time],  	1 (прибавить час)
		end[		M10.5.0  конец применения для DST
		/time]
		]
		]

Считайте приведенное выше - "от фонаря", разбирал по памяти. Все по стандарту разберите сами, по ссылке в 

первых постах по QNX  там все расписано, включая кто-есть-ху M3.5.0 и M10.5.0

Но лучше потратьте время найти функции библиотеки C или ОС, чтобы "скормить" им эту строку, а далее получать нужную инф. уже в удобоваримом - стандартном виде из структур или сист.переменных.

ps  разбор

[America/New_York]
TZ=EST5EDT,M3.2.0/2,M11.1.0
EST = designation for standard time when daylight saving is not in force
5 = offset in hours = 5 hours west of Greenwich meridian (i.e. behind UTC)
EDT = designation when daylight saving is in force (if omitted there is no daylight saving)
, = no offset number between code and comma, so default to one hour ahead for daylight saving
M3.2.0 = when daylight saving starts = the 0th day (Sunday) in the second week of month 3 (March)
/2, = the local time when the switch occurs = 2 a.m. in this case
M11.1.0 = when daylight saving ends = the 0th day (Sunday) in the first week of month 11 (November). No time is given here so the switch occurs at 02:00 local time.
So daylight saving starts on the second sunday in March and finishes on the first Sunday in November. The switch occurs at 02:00 local time in both cases. This is the default switch time, so the /2 isn't strictly needed.
  

формат 

 TZ    Timezone information. TZ has the form:

                stdoffset[dst[offset],[start[/time],end[/time]]]

           std and dst
                 Three or more bytes that are the designation for
                 the  standard  (std)  and  daylight savings time
                 (dst) timezones.  Only std is required.  If  dst
                 is  missing, then daylight savings time does not
                 apply in  this  locale.  Upper-  and  lower-case
                 letters  are  allowed.   Any characters except a
                 leading colon (:), digits, a comma (,), a  minus
                 (-) or a plus (+) are allowed.

           offset
                 Indicates the value one must add  to  the  local
                 time  to  arrive  at Coordinated Universal Time.
                 The offset has the form:

                 hh[:mm[:ss]]

                 The minutes (mm) and seconds (ss) are  optional.
                 The  hour  (hh)  is required and may be a single
                 digit.  The offset following  std  is  required.
                 If no offset follows dst , daylight savings time
                 is assumed to be  one  hour  ahead  of  standard
                 time.  One or more digits may be used; the value
                 is always interpreted as a decimal number.   The
                 hour  must  be between 0 and 24, and the minutes
                 (and seconds) if present between 0 and 59.   Out
                 of   range   values   may   cause  unpredictable
                 behavior.  If preceded by a "-" the timezone  is
                 east of the Prime Meridian; otherwise it is west
                 (which may be indicated by an optional preceding
                 "+" sign).

           start/time,end/time
                 Indicate when to change to and  back  from  day-
                 light  savings  time, where start/time describes
                 when the change from standard time  to  daylight
                 savings time occurs, and end/time describes when
                 the  change  back  happens.   Each  time   field
                 describes  when,  in  current  local  time,  the
                 change is made.

                 The formats of start and end are one of the fol-
                 lowing:

                 Jn    The Julian day n (1 < n < 365). Leap  days
                       are  not  counted.  That is, in all years,
                       February 28 is day 59 and March 1  is  day
                       60.   It  is  impossible  to  refer to the
                       occasional February 29.

                 n     The zero-based Julian day (0 < n  <  365).
                       Leap  days are counted, and it is possible
                       to refer to February 29.

                 Mm.n.d
                       The d**th day, (0 < d < 6) of  week  n  of
                       month  m  of  the year (1 < n < 5, 1 < m <
                       12), where week 5 means "the last d-day in
                       month  m"  which  may  occur in either the
                       fourth or the fifth week). Week 1  is  the
                       first week in which the  d**th day occurs.
                       Day zero is Sunday.

           Implementation specific defaults are used  for   start
           and end if these optional fields are not given.

                 The time has the same format  as  offset  except
                 that no leading sign ("-" or "+" is allowed. The
                 default, if time is not given is 02:00:00.

 

Все - ТУТ www.di-mgt.com.au/wclock 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, Метценгерштейн сказал:

может и разжевано, но проще нет варианта, чем парсить это всё.

 

Текст с указанием смещения (+3) - это название таймзоны и парсить ее нет необходимости, потому что все необходимые переменные содержатся в соответствующей структуре. (разница в минутах между зоной и гринвичем, разница в минутах между летним и зимним временем и их границы.

Достается эта структура через API.  В последних Windows - просто вызов функции, в более ранних - через АПИ  работы с реестром.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...