我正在将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", ¤tDateUNIX)) {
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] 删除。
我来说两句