将自2000-01-01 00:00:00以来的小时数转换为C编程中的日期YYYYMMDDHH

时间:2015-11-10 21:49:22

标签: c date datetime netcdf

我已经从netcdf文件中获取了一个日期,格式为2000-01-01 00:00:00以来的小时数。我需要将此日期转换为YYYYMMDDHH格式,其中Y为年,M为月,D为日,H为小时,为c程序。关于如何做到这一点的任何想法?

我知道在python中我可以通过以下代码行完成此操作:

dttme=datetime.strptime('2000-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') + timedelta(hours=dates[0])
dttme2=datetime.strftime(dttme, "%Y%m%d%H")

但是如何在C编程中执行此操作?

感谢您的时间。

4 个答案:

答案 0 :(得分:1)

您可以使用scanf而不是strptime。 看看http://man7.org/linux/man-pages/man3/strptime.3.html

在页面底部还有一个使用strptimestrftime的示例。

答案 1 :(得分:1)

使用mktime()能力来处理其主要范围之外的值。

"%Y%m%d%H"格式

使用YYYYMMDDHH
char *t2000(char * dest, size_t size, int hours) {
  // zero all fields
  struct tm tm = {0};
  tm.tm_year = 2000 - 1900;
  // tm.tm_mon = 1-1;
  tm.tm_mday = 1;
  tm.tm_hour += hours;
  if (mktime(&tm) == -1) return NULL;
  if (strftime(dest, size, "%Y-%m-%d %H:%M:%S", &tm) == 0) return NULL;
  return dest;
}

答案 2 :(得分:0)

我能够通过谷歌搜索找到它 - 我搜索了scanf,这个页面是第一个:http://www.cplusplus.com/reference/cstdio/scanf/

以下是一个例子:

 scanf("%4i-%2i-%2i %2i:%2i:%2i",&year,&month,&day,&hour,&min,&sec);

其中所有这些都被声明为整数。

答案 3 :(得分:0)

如果我理解正确netcdf文件只为您提供 hours-since-epoch 并且您需要将小时数转换为日期字符串,那么除非您补充从epoch开始的当前小时数以及当前的小时数和秒数,您的字符串将限制为显示仅精确到小时(无分钟或秒)的日期字符串。实际上,如果我理解正确的话,这就是你所拥有的,小时数据,没有分钟或秒数。

考虑到这一点,您可以使用localtime小时来获取与strftime一起使用的细分时间结构,以获得精确到小时的日期字符串,其类似于: / p>

char *epoch_h2date (char * dest, size_t size, int hours)
{
    struct tm *tm = NULL;
    time_t t = hours * 3600;    /* seconds since epoch  */

    tm = localtime (&t);

    if (strftime(dest, size, "%Y-%m-%d %H:%M:%S", tm) == 0)
        return NULL;

    return dest;
}

如果您拥有的是 hours-since-epoch 并且您想要提供分钟/秒数据,那么您基本上只是在发明这些数据。话虽这么说,你可以很容易地采取当前的秒 - 自 - 纪元,并采取当前的分钟:从那一小时后的秒。