C++ mktime and DST
C++ mktime and DST
我正在处理存储的日期和时间。我将它们以字符串格式存储在GMT格式的文件中(即DDMMYYYYHHMMSS
)。当客户端查询时,我将此字符串转换为struct tm
,然后使用mktime
将其转换为秒。我这样做是为了检查无效的DateTime。我再次将秒转换为字符串格式。这些处理都很好,没有任何问题。
但是我有一个奇怪的问题:我在GMT中存储日期和时间,区域设置也是GMT。由于夏令时,我的地区时间改为GMT+1。现在,如果我查询存储的日期和时间,我得到1小时少,因为mktime
函数使用区域设置,即GMT+1,将struct tm
转换为秒(tm_isdst
设置为-1,因此mktime
自动检测夏令时等)。
有什么办法可以解决这个问题吗?
使用_mkgmtime
/timegm
作为mktime
的补充。
time_t mkgmtime(struct tm* tm)
{
#if defined(_WIN32)
return _mkgmtime(tm);
#elif defined(linux)
return timegm(tm);
#endif
}
http://www.cplusplus.com/reference/ctime/tm/夏令时标志(tm_isdst)在夏令时有效时大于零,在夏令时无效时为零,在信息不可用时小于零。
一般算法如下:
- 将您的输入传递给
mktime
。 - 将输出传递给
gmtime
- 将输出传递给
mktime
这里是一个编码示例:
struct tm input = Convert(input_string); // don't forget to set 'tm_isdst' here
time_t temp1 = mktime(&input);
struct tm* temp2 = gmtime(&temp1);
time_t output = mktime(temp2);
注意gmtime
函数不是线程安全的,因为它返回static struct tm
的地址。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- Threads with Classes and std::packaged_task
- C++ mktime and DST