我已经从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编程中执行此操作?
感谢您的时间。
答案 0 :(得分:1)
您可以使用scanf
而不是strptime
。
看看http://man7.org/linux/man-pages/man3/strptime.3.html
在页面底部还有一个使用strptime
和strftime
的示例。
答案 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 并且您想要提供分钟/秒数据,那么您基本上只是在发明这些数据。话虽这么说,你可以很容易地采取当前的秒 - 自 - 纪元,并采取当前的分钟:从那一小时后的秒。