Безопасно ли преобразовывать даты назад и вперед, используя UTC, чтобы игнорировать DST, но при этом использовать действительную локаль для текущего пользователя?

У меня есть дата (без времени, при условии времени 00:00:00), которую я конвертирую между time_t и struct tm,

Я получаю дату в простом формате ГГГГММДД и преобразую ее в struct tm:

struct tm my_tm;
memset(&my_tm, 0, sizeof(my_tm));
my_tm.tm_year = str.mid(0, 4).toInt() - 1900;
my_tm.tm_mon = str.mid(4, 2).toInt() - 1;
my_tm.tm_mday = str.mid(6, 2).toInt();
  • П.С .: для тех, кому интересно, у меня есть QString (Qt) отсюда mid() а также toInt() участники использовали.

Затем я конвертирую эту дату в time_t с помощью mktime():

time_t my_time(mktime(&my_tm));

В этот момент дата изменится на день раньше (точнее, -1 ч), если дата — 6 марта 2016 г. («20160306» становится 2016/03/05 в struct tm). Это из-за DST (tm_isdst устанавливается соответственно).

У меня есть другая версия mktime() называется mkgmtime() и это работает как ожидалось: я получаю ту же дату, так как DST игнорируется этой функцией:

time_t my_time(mkgmtime(&my_tm));

Затем я могу преобразовать дату обратно в struct tm с использованием gmtime_r() функция. Таким образом, опять же, я получаю ту же дату:

struct tm other_tm;
gmtime_r(&my_time, &other_tm);

Тем не менее, в какой-то момент я хочу отобразить дату в стандартном формате, как определено языковым стандартом конечного пользователя. Для этого я использую библиотеку ICU. В следующем я заставляю f_current_timezone переменная в UTC перед вызовом format_date()тогда дата выходит как 6 марта 2016 г. (если я сохраню часовой пояс пользователя, вместо этого 5 марта 2016 г..)

QString locale::format_date(time_t d)
{
QUnicodeString const timezone_id(f_current_timezone);
LocalPointer<TimeZone> tz(TimeZone::createTimeZone(timezone_id));
Locale const l(f_current_locale.toUtf8().data());
LocalPointer<DateFormat> dt(DateFormat::createDateInstance(DateFormat::kDefault, l));
dt->setTimeZone(*tz);
UDate const udate(d * 1000LL);
QUnicodeString u;
dt->format(udate, u);
return u;
}

Безопасно ли (имеет ли это для вас смысл) использовать «UTC» в качестве часового пояса для получения правильного результата? format_date()?

4

Решение

Перед использованием mktime()установите tm_hour на 12 (12 вечера). Если все, что вас волнует, это форматирование части даты, используя местоположение приложения, используя полдень для mktime() будет достаточно для этой цели.

0

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

Других решений пока нет …

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