我有一个8601格式的时间字符串,如下所示:
std :: string strTime(" 1601-01-01T00:01:53.537Z");
我想增加小时并将其值更改为
" 1601-01-01T01:01:53.537Z"
我认为步骤是:将字符串转换为时间对象,将小时增加1,将对象转换回字符串。
当然,如果考虑所有正常时间考虑因素和边界(例如将一小时到晚上11:30添加到第二天等等,将会有所帮助)。我一直在关注strftime,strptime,std :: get_time和其他人,但还没有能够解决它。
我在Windows上使用VS2012。感谢。
答案 0 :(得分:0)
一些伪代码可以帮助您入门。
char *AddHour(char *dest, size_t size, const char *timestamp) {
Initialize struct tm
Scan timestamp into tm
Check scanning success
Check year range validity
Bring into range acceptable by mktime()
Add hour
Call mktime()
Undo range adjustment made beforehand
Print tm to dest
return dest;
}
即使mktime()
使用本地时区,通过保留tm_isdst == 0
我们可以将其用于Z时区(UTC)用于所有实际目的。
答案 1 :(得分:0)
只需将字符串扫描成各个部分即可。加1小时,然后改写字符串
string --> struct tm tm;
// Add hour
if (++tm.tm_hour >= 24) {
tm.tm_hour = 0;
if (++tm.tm_mday > EOM(tm.tm_year, tm.tm_mon)) {
tm.tm_mday = 1;
if (++tm.tm_mon > 12) {
tm.tm_mon = 1;
tm.tm_year++;
}
}
}
struct tm tm --> string
答案 2 :(得分:0)
我编写了一个C库,它使用扩展格式的时间和区域指示符解析和格式化ISO 8601日历日期。它可以在Github上获得,c-timestamp。
{
timestamp_t ts;
char *str = "1601-01-01T00:01:53.537Z";
timestamp_parse(str, strlen(str), &ts);
ts.sec += 1*60*60;
timestamp_format(str, strlen(str), &ts);
puts(str);
}