C ++:在时区之间转换保持精度的日期时间

时间:2014-04-13 14:40:47

标签: c++ boost time

考虑输入:2014-04-14T16:28:07.023(没有时区,毫秒精度) 我解析了它,我将这些部分作为数字。

  • 输入始终被视为UTC
  • 我想将其显示为当地时间
  • 我希望在显示时保持毫秒精度

我有C ++ 98并且提升1.51。

我检查了high_resolution_clocksystem_clock,但无法确定问题的最终情节。

2 个答案:

答案 0 :(得分:1)

我有一个对我来说足够的解决方案,但我不知道它是否是一般的最佳方法。我即将使用boost::posix_time::ptimeboost::date_time的{​​{3}}:

#include <iostream>
#include <boost/date_time.hpp>
#include <boost/date_time/c_local_time_adjustor.hpp>

int main()
{
  typedef boost::posix_time::ptime TP;
  typedef boost::date_time::c_local_adjustor<TP> local_adj;

  TP tUTC(boost::gregorian::date(2014,4,13),boost::posix_time::millisec(23));
  TP tLocal(local_adj::utc_to_local(tUTC));

  std::cout << boost::posix_time::to_simple_string(tUTC) << std::endl;
  std::cout << boost::posix_time::to_simple_string(tLocal) << std::endl;

  return 0;
}

将打印:

2014-Apr-13 00:00:00.023000
2014-Apr-13 02:00:00.023000

我没有使用using namespace来显示哪里是什么。 ptime类具有我需要的每个细节的访问器。 c_local_adjustor没有local_to_utc方法,但它可以解决。

chrono无处可去,我只能在文档中做圆圈。)

答案 1 :(得分:1)

根据评论中的要求发布作为答案,以下是如何在没有Boost的情况下完成:

#include <iostream>
#include <stdlib.h>
#include <time.h>

int main() {
  int year, month, day, hour, minute, second, millisecond;
  if (std::cin >> year >> month >> day >> hour >> minute >> second >> millisecond) {
    struct tm utc;
    utc.tm_year = year;
    utc.tm_mon = month;
    utc.tm_mday = day;
    utc.tm_hour = hour;
    utc.tm_min = minute;
    utc.tm_sec = second;
    utc.tm_isdst = 0;

    time_t time = timegm(&utc);
    if (time == (time_t) -1)
      abort();

    struct tm *local = localtime(&time);
    if (localtime == NULL)
      abort();

    year = local->tm_year;
    month = local->tm_mon;
    day = local->tm_mday;
    hour = local->tm_hour;
    minute = local->tm_min;
    second = local->tm_sec;

    std::cout << year << ' ' << month << ' ' << day << ' ' << hour << ' ' << minute << ' ' << second << ' ' << millisecond << std::endl;
  }
}

请注意,millisecond变量从输入读取,并写入输出,无需任何修改。

这使用非标准timegm函数,但该函数的文档包含一个可以包含的更便携的实现,如果需要的话。