如何在Windows上用C ++添加1小时到8601格式的时间字符串?

时间:2015-12-11 18:29:59

标签: c++ string windows time iso8601

我有一个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。感谢。

3 个答案:

答案 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);
}