gpt4 book ai didi

c++ - 处理夏令时 - C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:11 25 4
gpt4 key购买 nike

给定一个输入日期和时间(字符串格式),我试图使用 ctime 中给出的 time 函数获取它的纪元时间,例如 mktime 。将 time_t 纪元时间转换回日期和时间会导致日期和时间比原始时间少一小时。我经历了一些讨论,说在夏令时的情况下可能会调整一小时。这是代码:

//sample strptime program.

#include <iostream>
#include <ctime>
#include <string>
using namespace std;

long parseTime(string time) {

cout << "Time entered = " << time << endl;

long timeSinceEpoch;

struct tm t;

if(time.find("/") != string::npos) {
//format of date is mm/dd/yyyy. followed by clock in hh:mm (24 hour clock).
if(strptime(time.c_str(), "%m/%e/%Y %H:%M", &t) == NULL) {
cout << "Error. Check string for formatting." << endl;
}
} else if(time.find("-") != string::npos) {
//format of date is yyyy-mm-dd hh:mm:ss (hh in 24 hour clock format).
cout << "I am here." << endl;
if(strptime(time.c_str(), "%Y-%m-%e %H:%M:%S", &t) == NULL) {
cout << "Error. Check string for formatting of new date." << endl;
}
}

cout << "Details of the time structure:" << endl;
cout << "Years since 1900 = " << t.tm_year << endl;
cout << "Months since January = " << t.tm_mon << endl;
cout << "Day of the month = " << t.tm_mday << endl;
cout << "Hour = " << t.tm_hour << " Minute = " << t.tm_min << " second = " << t.tm_sec << endl;

timeSinceEpoch = mktime(&t);
time_t temp = mktime(&t);
cout << "Time since epoch = " << timeSinceEpoch << endl;

cout << "Reconverting to the time structure:" << endl;
struct tm* t2 = localtime(&temp);
cout << "Details of the time structure:" << endl;
cout << "Years since 1900 = " << t2->tm_year << endl;
cout << "Months since January = " << t2->tm_mon << endl;
cout << "Day of the month = " << t2->tm_mday << endl;
cout << "Hour = " << t2->tm_hour << " Minute = " << t2->tm_min << " second = " << t2->tm_sec << endl;

return timeSinceEpoch;
}

int main(int argc, char *argv[]) {

string date, t;
cout << "Enter date: " << endl;
cin >> date;
cout << "Enter time: " << endl;
cin >> t;

struct tm time;
string overall = date + " " + t;

long result = parseTime(overall);
cout << "Time in date + time = " << overall << " and since epoch = " << result << endl;

return 0;
}

麻烦的输入是:日期:2013-03-11时间:04:41:53

我的问题:
1. 检查 tm_idst 标志返回非零值,表明夏令时有效。但是,我怎么知道谈论的是哪个时区?
2. 上面给出的时间戳可能没有记录在与我所在的同一时区。有没有办法指定时区,以便正确设置 tm_idst 标志?
3. 不确定时间戳记录在哪个时区时如何处理夏令时?

最佳答案

Plain C++ 时区数据非常稀疏,并且在格式化时没有指定时区,在某些时间段内您会得到不一致的结果 - 例如时钟倒退后的重复时间。这就是为什么始终建议以 UTC 记录所有时间戳的原因 - 即从不将时区应用于记录的时间戳,以 GMT 记录,然后来回将该值作为显示变量,您可以完全控制它。

Linux/BSD 有一些额外的字段可用于确定时区和与 UTC 的偏移量 - 例如在 Linux 上它是 __tm_gmtoff 字段,在 BSD(/Mac OS X) 上它被称为 tm_gmtoff

还有一个额外的字段标记时区,在 linux 上是 __tm_zone ,在 BSD(/Mac OS X) 上是 tm_zone ,但是只有当你获取本地时间。

我稍微修改了你的例子,得到了以下输出:

Time entered = 2013-04-05 15:00
I am here.
Error. Check string for formatting of new date.
Details of the time structure:
Years since 1900 = 113
Months since January = 3
Day of the month = 5
Hour = 15 Minute = 0 second = 0
gmtoff = 0
Time since epoch = 1365174000
Reconverting to the time structure:
Details of the time structure:
Years since 1900 = 113
Months since January = 3
Day of the month = 5
Hour = 16 Minute = 0 second = 0
gmtoff = 3600
Zone = IST
Time in date + time = 2013-04-05 15:00 and since epoch = 1365174000

如果您在 Windows 中使用此结构,您将不得不使用另一种机制,因为它没有这两个额外的字段。

关于c++ - 处理夏令时 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15667253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com