用C传递的日期时间来生产UNIX时间戳

喀麦隆2

我正在将C应用程序从Solaris移植到RedHat,并且此功能在RedHat上效果不佳(我需要您的帮助来确定原因):

int toTimestamp (const char *InputDate, const char *DateFormat, time_t *lTimestamp){
    struct tm tm;

    if (NULL == strptime(InputDate, DateFormat, &tm)){
        return FALSE;
    }
    *lTimestamp = mktime(&tm);
    return TRUE;    
}

基本上,它会以指定格式以字符串形式传入日期时间后产生UNIX时间戳。

char *effPaymentDate = NULL;
char *CohDueDate = NULL;
//...
effPaymentDate = PayRec->RecDate;//char RecDate[8+1];, value 20141005
CohDueDate = PayRec->DueDate;//char DueDate[8+1];, value 20140820

time_t currentDateUNIX;
time_t DueDateUNIX;
if (FALSE == toTimestamp(CohDueDate, "%Y%m%d", &DueDateUNIX) ||
     FALSE == toTimestamp(effPaymentDate, "%Y%m%d", &currentDateUNIX)) {
  return NULL;
}
//...

但是,它似乎无法正常运行(对于effPaymentDate可以正常工作,为CohDueDate输入错误的日期-即2543年)-为什么有任何想法?

可可

TL; DR:

您需要先进行初始化,tm然后再将其传递给API:

memset(&tm, 0, sizeof tm);

为什么 ?

strptime 可能会失败而没有通知您:

$ man strptime

返回值
函数的返回值是指向此函数调用中未处理的第一个字符的指针。如果输入字符串包含的字符超出了格式字符串的要求,则返回值将指向最后一个消耗的输入字符之后。如果整个输入字符串都被消耗了,则返回值指向字符串末尾的空字节。如果strptime()无法匹配所有格式字符串,因此发生错误,则该函数返回NULL。

笔记

原则上,此函数不初始化tm,而仅存储指定的值。这意味着应该在调用之前初始化tm。不同的UNIX系统之间的细节有些不同。glibc实现不涉及那些未明确指定的字段,除非如果更改了年,月或日元素中的任何一个,它将重新计算tm_wday和tm_yday字段。

因此,由于tm未设置为0,因此某些字段可能包含随机值。

而且:

$ man mktime

mktime()函数修改tm结构的字段,如下所示:tm_wday和tm_yday设置为从其他字段的内容确定的值;如果结构成员超出其有效间隔,则将其标准化(例如,将10月40日更改为11月9日);将tm_isdst设置为正值(无论其初始值如何)或设置为0,以指示DST在指定时间是否有效。调用mktime()还会设置外部变量tzname以及有关当前时区的信息。

随机值可能超出范围,并mktime尝试对其进行标准化。虽然做得不错,但被year出卖了!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

日期时间Unix时间戳包含毫秒

来自分类Dev

从unix时间戳获取日期和时间

来自分类Dev

JS获取与UNIX时间戳或时间戳日期的时差

来自分类Dev

日期时间的时间戳函数与预期的 UNIX 时间不匹配

来自分类Dev

C#Unix时间戳

来自分类Dev

带有UNIX时间戳的BusyBox日期命令设置时间

来自分类Dev

如何将Unix时间戳转换为日期时间

来自分类Dev

将Unix时间戳转换为日期时间

来自分类Dev

将UNIX时间戳转换为日期时间(javascript)

来自分类Dev

带有UNIX时间戳的BusyBox日期命令设置时间

来自分类Dev

Unix时间戳怀疑

来自分类Dev

比较日期时间戳

来自分类Dev

Firebase的日期与时间戳

来自分类Dev

Firebase的日期与时间戳

来自分类Dev

PHP日期时间戳

来自分类常见问题

如何在Jooq中选择unix时间戳作为日期?

来自分类Dev

将Python日期转换为Unix时间戳

来自分类Dev

在Java中将Unix时间戳转换为日期

来自分类Dev

Unix时间戳转换PHP-错误的日期

来自分类Dev

如何在CockroachDB中将Unix时间戳转换为日期?

来自分类Dev

将日期unix转换为时间戳

来自分类Dev

POSTGRESQL将日期转换为unix时间戳int

来自分类Dev

将数据库日期转换为Unix时间戳

来自分类Dev

从Unix时间戳获取格式化日期

来自分类Dev

将实际日期转换为Unix时间戳PHP

来自分类Dev

ng2-chart日期显示为unix时间戳

来自分类Dev

将Epoch或Unix时间戳转换为日期ANDROID

来自分类Dev

从'n / j Y'日期PHP获取Unix时间戳

来自分类Dev

Java从Unix时间戳获取当前日期