在C编程中,将2000-01-01 00:00:00到YYYYMMDDHH之间的小时数转换为日期

在C编程中,将2000-01-01 00:00:00到YYYYMMDDHH之间的小时数转换为日期,c,date,datetime,netcdf,C,Date,Datetime,Netcdf,从2000-01-01 00:00:00开始,我从netcdf文件中以小时的格式获取了日期。我需要将这个日期转换成YYYYMMDDHH格式,在c程序中,Y是年,M是月,D是天,H是小时。你知道怎么做吗 我知道在python中,我可以通过以下代码行实现这一点: dttme=datetime.strptime('2000-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') + timedelta(hours=dates[0]) dttme2=datetime.strftime

从2000-01-01 00:00:00开始,我从netcdf文件中以小时的格式获取了日期。我需要将这个日期转换成YYYYMMDDHH格式,在c程序中,Y是年,M是月,D是天,H是小时。你知道怎么做吗

我知道在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编程中我该怎么做呢


谢谢您的时间。

我通过谷歌搜索找到了它-我搜索了scanf,这个页面是第一个:

以下是一个例子:

 scanf("%4i-%2i-%2i %2i:%2i:%2i",&year,&month,&day,&hour,&min,&sec);
其中所有这些都声明为整数。

可以使用strtime而不是scanf。 看看

在页面底部还有一个使用strtime和strftime的示例。

使用mktime功能处理其主要范围以外的值

对YYYYMMDDHH格式使用%Y%m%d%H


如果我正确理解netcdf文件仅提供自历元以来的小时数,并且您需要将小时数转换为日期字符串,则除非您使用当前的小时数分钟和秒数来补充自历元以来的当前小时数,您的字符串将限于显示仅精确到小时、分钟或秒的日期字符串。事实上,如果我理解正确的话,这就是你所有的,小时数据,没有分钟或秒

考虑到这一点,您可以使用hours和localtime来获得一个分解的time结构,并与strftime一起使用,以获得一个精确到hour的日期字符串,类似于:

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;
}

若你们所拥有的只是从新纪元开始的数小时,并且你们想提供分/秒的数据,那个么你们实际上只是在创造那个些数据。这就是说,你可以很容易地从epoch开始计算当前的秒数,然后再从epoch开始计算当前的分钟数:一小时后的秒数。

你的研究工作在哪里,是对的还是错的?你需要使用scanf或FSCANFID。你先尝试谷歌搜索吗?这对你没有什么帮助?@SouravGhosh-垃圾评论不是helpful@Hogan对不起,我不是故意粗鲁的。我只是想确定OP已经做了背景工作。另外,我也不太确定是否会发垃圾邮件。没有冒犯的意思应该注意,strtime是POSIX函数,而不是c标准的一部分。它从libc 4.6.8开始就包含在c库中,需要定义用于glibc2的_XOPEN_源或_GNU_源。@David c.Rankin编码错误已更正。我的gcc至少在1902-2037年的工作时间范围内都很好。唯一让我停顿的是坚持从大纪元开始的当前工作时间,我得到了2045年的工作时间。我可能弄糟了什么。@David C.Rankin没错,mktime工作的扩展范围没有定义-YMMV在2000年左右的几十年里,我对值没有任何问题。一个描述混乱时间t=hours*3600;依赖于以秒为单位的时间-这不是C标准定义的。嗯。。。在这里,它实际上依赖于以小时为单位的小时数,而时间等于int,根据混乱的文档,int是一个合理的标准实现。至于localtime调用,它以秒为单位,或者至少是小时的3600倍:
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;
}