Нет очевидной временной метки с типом смещения часового пояса для C++. Свернуть наши собственные?

Я искал Google и StackOverflow и нашел тангенциальные обсуждения, но ничего не касалось этого: существует ли какой-либо стандартный или широко используемый тип С++ для хранения временной метки, соответствующей (местному времени, смещению от UTC)?

Этот формат даты соответствует ISO 8601, System.DateTimeOffset в .NET и TIMESTAMP WITH TIME ZONE в некоторых системах баз данных.

Предпочтительно, я бы надеялся на что-то, что правильно обрабатывает сравнения и дельты и уже имеет преобразование в/из ISO 8601.

Примечания:

  • Какими бы ни были их преимущества, использование часовых поясов типа POSIX не вариант. Системы, с которыми мы взаимодействуем, используя стандартные интерфейсы медицинской отрасли, предоставляют временные метки либо в виде неопределенного местного времени, либо в виде (местное время, смещение от UTC). Они просто не предоставляют полную информацию о часовом поясе.

  • Преобразовывать все в UTC тоже не вариант. Местное время, с точки зрения системы, записавшей время, является важной частью информации, которую мы не можем потерять.

  • time_point в boost и C++11 прекрасен, но я не вижу, как применить его к этой проблеме, по крайней мере, без громоздкого увеличения количества часов (или эпох). Но я открыт для руководства о том, как это может быть.

Запасной вариант — свернуть свой собственный, но я не могу поверить, что мы первые, кто столкнулся с этим вопросом.


person Dan K    schedule 04.06.2013    source источник
comment
Я думаю, что все остальные использовали либо время POSIX, либо UTC, либо boost/C++11. Я не могу представить, почему они не работают для вас.   -  person Mooing Duck    schedule 05.06.2013
comment
Я бы сказал, просто используйте один из обычных типов, вместе с исходным часовым поясом, и кажется, что все решено.   -  person Mooing Duck    schedule 05.06.2013


Ответы (1)


Вместо сохранения местного времени и смещения TZ используйте boost::local_date_time и сохраните время в формате UTC и смещение TZ. Это работает точно так же и уже было свернуто для вас.

person Mark B    schedule 04.06.2013
comment
Спасибо, Марк, но мне не помешало бы разъяснение. boost::localDateTime требует time_zone_ptr, и даже custom_time_zone нужны имена и другая информация, которая недоступна в ISO 8601/и т. д. Есть ли какой-то вариант time_zone, который был бы доволен только смещением UTC? - person Dan K; 05.06.2013
comment
Комментарии для time_zone_base предполагают, что вы можете создать подкласс, который использует смещение UTC. Исходя из этого, я принимаю этот ответ. Спасибо, Марк Б., за то, что указал мне правильное направление. - person Dan K; 10.06.2013