考虑输入:2014-04-14T16:28:07.023
(没有时区,毫秒精度)
我解析了它,我将这些部分作为数字。
我有C ++ 98并且提升1.51。
我检查了high_resolution_clock
和system_clock
,但无法确定问题的最终情节。
答案 0 :(得分:1)
我有一个对我来说足够的解决方案,但我不知道它是否是一般的最佳方法。我即将使用boost::posix_time::ptime
和boost::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
函数,但该函数的文档包含一个可以包含的更便携的实现,如果需要的话。