我尝试编写函数以帮助自己轻松地将string
转换为time_t
和time_t
转换为string
。然而,它总是让我错误的一年和一个错误的时刻。怎么了?
我需要它独立于操作系统!
例如,对于日期30/11/2012:09:49:55
,它会30/11/3912:08:49:55
而不是30/11/2012:09:49:55
。
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
time_t string_to_time_t(string s)
{
int yy, mm, dd, hour, min, sec;
struct tm when;
long tme;
memset(&when, 0, sizeof(struct tm));
sscanf(s.c_str(), "%d/%d/%d:%d:%d:%d", &dd, &mm, &yy, &hour, &min, &sec);
time(&tme);
when = *localtime(&tme);
when.tm_year = yy;
when.tm_mon = mm-1;
when.tm_mday = dd;
when.tm_hour = hour;
when.tm_min = min;
when.tm_sec = sec;
return mktime(&when);
}
string time_t_to_string(time_t t)
{
char buff[20];
strftime(buff, 20, "%d/%m/%Y:%H:%M:%S", localtime(&t));
string s(buff);
return s;
}
int main()
{
string s = "30/11/2012:13:49:55";
time_t t = string_to_time_t(s);
string ss = time_t_to_string(t);
cout << ss << "\n";
return 0;
}
答案 0 :(得分:1)
结构tm_year
中的std::tm
保留了1900以来的年份。
因此,而不是when.tm_year = yy;
从年份中减去1900,而不是when.tm_year = yy-1900;
:tm_isdst
您可以查看运行here的代码。
编辑:正如sfjac指出的那样,我的回答并没有解决DST问题。
小时的问题是DST标志。由于我无法在ideone上重现问题,因此只能在本地...系统可能会根据local settings设置when.tm_isdst
。
您需要将 Login.post($scope.user);
设置为0或负数,具体取决于您的需要。如果您知道日期时间没有DST,则设置为0;如果不知道,则设置为-1(负数)。