Вам нужно знать о базе данных Olson tz , которая доступна из ftp://elsie.nci.nih.gov/pub http: / /iana.org/time-zones/. Он обновляется несколько раз в год, чтобы иметь дело с часто последними изменениями в том, когда (и будет ли) переключаться между зимним и летним (стандартным и летним) временем в разных странах мира. В 2009 году последний выпуск был выпущен в 2009 году; в 2010 году это было 2010n; в 2011 году это было 2011n; в конце мая 2012 года релиз был 2012c. Обратите внимание, что существует набор кода для управления данными и фактическими данными самого часового пояса в двух отдельных архивах (tzcode20xxy.tar.gz и tzdata20xxy.tar.gz).
Это источник имен часовых поясов, таких как America / Los_Angeles (и синонимы, такие как US / Pacific).
Если вам нужно для отслеживания различных зон, вам нужна база данных Olson. Как сообщали другие, вы также хотите сохранить данные в фиксированном формате & mdash; Обычно UTC - это выбранный вариант; наряду с записью часового пояса, в котором были созданы данные. Вы можете различать смещение от UTC в момент времени и имя часового пояса; это может изменить ситуацию позже. Кроме того, зная, что в настоящее время 2010-03-28T23: 47: 00-07: 00 (US / Pacific) может или не поможет вам интерпретировать значение 2010-11-15T12: 30 & mdash; который, по-видимому, указан в PST (Pacific Standard Time), а не в PDT (Pacific Daylight Saving Time).
Стандартные интерфейсы библиотеки C не очень полезны для такого рода вещей.
Данные Олсона переместились, частично потому, что AD Olson скоро уйдет в отставку, а отчасти из-за того, что был подан иск (в настоящее время уволен) против сопровождающих за нарушение авторских прав. База данных часовых поясов теперь управляется под эгидой IANA , авторитета Интернет-назначенных номеров, а на первой странице есть ссылка на «База данных Часовой пояс» . Список рассылки для обсуждения теперь tz@iana.org
; список объявлений - tz-announce@iana.org
.
Я бы сделал это в C, используя struct
с членом union
:
typedef struct ast_function
{
ast_node* arguments;
symbol* sym;
} ast_function;
typedef struct ast_while
{
ast_node* condition;
ast_node* while_branch;
} ast_while;
typedef struct ast_assignment
{
symbol* sym;
ast_node* value;
} ast_assignment;
/* Etc. */
typedef struct ast_node {
int node_type;
/* See anonymous unions in any C reference */
union {
ast_function function_data;
ast_while while_data;
ast_assignment assignment_data;
/* Etc. */
};
}
Тогда вам вообще не нужны приведения:
[111 ] Если вы сделаете node_type
вместо int
вместо [116], компилятор сможет предупредить вас, если вы упустите возможность в своем выражении switch
.