Представление даты до эпохи

У нас есть класс C ++ datetime, который представляет время в секундах, прошедших с начала эпохи. Это хранится как int64. Этот класс предоставляет ряд вспомогательных функций для чтения и записи различных типов форматов даты и времени.

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

Примером этого ограничения является неспособность нашего приложения хранить дни рождения до 1970 года, потому что каждая дата должна использовать этот класс.

Я не совсем понимаю, о чем я спрашиваю, это из-за моего ограниченного знания о внедрении / использовании datetime и моего нежелания понимать этот огромный класс наследства, поэтому, если вы чувствуете, что этот вопрос может быть сформулирован по-другому или я мог бы искать что-то другое, не стесняйтесь предлагать.

4

Решение

Вы могли бы использовать Boost.DateTime, или используйте Win32 API напрямую, а не ЭЛТ.

Вполне вероятно, что у вас впереди много испытаний, чтобы убедиться, что обработка данных не изменится в вашей переделке. Прежде чем приступить к рефакторингу, убедитесь, что у вас есть исчерпывающие модульные тесты для библиотеки в том виде, в каком она есть.

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

3

Другие решения

Возможно, вы уже решили эту проблему, так как это было много лет назад, но вы также можете использовать ICU. Примеры на: http://userguide.icu-project.org/datetime/calendar/examples

0

Скоро к реализация std :: lib рядом с тобой:

#include <chrono>
#include <iostream>

int
main()
{
using namespace std::chrono;
std::cout << "Valid range is ["<< sys_days{year::min()/January/1} + 0us << ", "<< sys_days{year::max()/December/31} + 23h + 59min + 59s + 999'999us
<< "]\n";
}

Выход:

Valid range is [-32767-01-01 00:00:00.000000, 32767-12-31 23:59:59.999999]

Предварительный просмотр доступен здесь.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector