将以字符串形式给出的时间(UTC)转换为本地时间
Convert a time (UTC ) given as a string to local time
我有一个像"132233"这样的时间字符串(时间只有日期),我想把它转换成本地时间。因此,为了使用函数localtime(),我首先使用mktime()将字符串转换为time_t(感谢c++中的How to convert a string variable containing time to time_t type?),然后使用strftime打印转换后的时间,如(http://www.cplusplus.com/reference/ctime/strftime/)我遇到了一个严重的运行时错误。谁能告诉我怎么了吗。提前感谢
int main()
{
string time_sample="132233";
std::string s_hrs (time_sample.begin(), time_sample.begin()+2);
std::string s_mins (time_sample.begin()+2,time_sample.begin()+4);
std::string s_secs (time_sample.begin()+4,time_sample.begin()+6);
int hrs = atoi(s_hrs.c_str());
int mins = atoi(s_mins.c_str());
int secs = atoi(s_secs.c_str());
struct tm time_sample_struct = {0};
time_sample_struct.tm_hour = hrs;
time_sample_struct.tm_min = mins;
time_sample_struct.tm_sec = secs;
time_t converted_time;
converted_time = mktime(&time_sample_struct);
struct tm * timeinfo;
char buffer[80];
timeinfo = localtime(&converted_time);
strftime(buffer,80,"%I:%M:%S",timeinfo);
puts(buffer);
cout<<endl;
getch();
return 0;
}
您的问题是,如果time_t
是一个32位值,那么它能够编码的最早日期(给定1970-1-1历元)是1901-12-13。
但是,您没有设置tm
结构的日期字段,这意味着它默认为代表1900-1-0
的0-0-0
(由于tm_day
是基于1的,因此实际上会以无效的日期结束)。
由于这不能用32位time_t
表示,因此mktime
函数失败并返回-1
,这是您没有检查的情况。
最简单的修复方法是将tm
结构的日期字段初始化为time_t
可以表示的内容:
time_sample_struct.tm_year = 114;
time_sample_struct.tm_mday = 1;
相关文章:
- C++:floor unix时间戳到UTC月份
- 提升,以分钟精度获得 UTC 时间
- 从ubuntu上的utc时间计算unix时间
- 如何使用闰秒以微秒为单位获取 UTC 时间
- 将具有 DST 的时间字符串转换为 UTC 时间戳
- 使用 std::chrono / date::gps_clock 将双 GPS 时间戳转换为 UTC/tai
- 高效生成 UTC 时间戳
- 如何在C++中以毫秒为单位获取今天的 UTC 午夜时间?
- C 自定义时间日期结构到UTC时期
- 如何将 UTC 时间戳转换为本地时间,即整点后的几秒钟
- 如何从 UTC 时间戳的组件(Y,M,D,H,M,S,MS)创建system_clock::time_point
- 无UTC时区中的正确时间总和
- Windows UTC时间夏令时是否独立
- 输出boost :: chrono :: system_clock :: time_point作为UTC的本地时间
- 跨平台C++:使用历史数据转换为 UTC/本地时间
- 如何获取UTC时间
- 从SYSTEMTIME到time_t的转换以UTC/GMT表示时间
- C++ 将包含 UTC 日期和时间的字符串转换为 TM 结构
- C++提升以 UTC 格式获取 unix 时间戳
- 将以字符串形式给出的时间(UTC)转换为本地时间