时间转换不具有确定性
Time conversions not deterministic
我写了一个程序,应该将iso 8601
字符串转换为std::chrono::system_clock::time_point
。但它有时有一种不确定的行为。如果多次执行程序,则解析的时间戳相差1小时。
据我所知,当你想将日期字符串(iso 8601
)转换为std::chrono::system_clock
类型时,如果你不想使用外部库,你目前需要ctime中的一些函数(这意味着你需要使用c函数)。
所以我使用了strptime()、mktime()和std::tm_t。
这是MWE:
#include <chrono>
#include <ctime>
#include <iostream>
#include <sstream>
int main(void) {
std::tm t;
strptime("2016-01-01T00:00:00", "%Y-%m-%dT%H:%M:%S", &t);
auto time = mktime(&t);
std::cout << "UNIX-seconds: " << time << std::endl;
//std::cout << "tm-hours: " << t.tm_hour << ", UNIX-seconds: " << time << std::endl;
auto tp = std::chrono::system_clock::from_time_t(time);
{
std::stringstream ss;
std::chrono::system_clock::to_time_t(tp);
}
}
如果你用g++编译它——std=c++14 main.cpp-o out
并运行多次,我得到以下2个输出之一:
UNIX-seconds: 1451599200
或
UNIX-seconds: 1451602800
但我现在不知道为什么我有时会得到第一个,有时会得到第二个。
如果你取消注释注释行,不确定性行为就会消失,我得到以下行:
tm-hours: 0, UNIX-seconds: 1451602800
我能做些什么来获得确定性行为?
我有debian 8,g++v4.9,我的电脑在欧洲/维也纳时区。
mktime
尊重std::tm
的tm_isdst
成员。CCD_ 8不改变该标志并且保留其先前的值。由于std::tm
是POD,tm_isdst
在默认构造中没有初始化,因此需要手动初始化,否则会得到indeteminate值。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 时间转换不具有确定性