在 C 中计算两个 ISO 8601 日期(包括毫秒)之间的差异
Posted
技术标签:
【中文标题】在 C 中计算两个 ISO 8601 日期(包括毫秒)之间的差异【英文标题】:Calculating the difference between two ISO 8601 dates (that include milliseconds) in C 【发布时间】:2015-09-13 09:05:52 【问题描述】:我有两个 ISO 8601 格式的日期:
20170423T221118.585Z
20170423T221119.583Z
在使用核心语言库的 C 语言 Linux 上,我如何计算这两个日期之间的毫秒差?
【问题讨论】:
【参考方案1】:使用核心 C 语言执行以下操作:
#include <stdio.h>
#include <time.h>
double subtract_dates(const char *start_date_time, const char *end_date_time);
void create_tm(time_t *ret_time, const char* date_time, int *ret_time_ms);
int main(int argc, char *argv[])
const char *start_date_time = "20170423T221118.585Z";
const char *end_date_time = "20170423T221119.583Z";
double msdiff;
msdiff = subtract_dates(end_date_time, start_date_time);
printf("Date/time difference(ms) = %f\n", msdiff);
double subtract_dates(const char *end_date_time, const char *start_date_time )
time_t ret_start_date_time;
time_t ret_end_date_time;
double diff_s;
int start_time_ms;
int end_time_ms;
double diff_ms;
create_tm(&ret_start_date_time, start_date_time, &start_time_ms);
create_tm(&ret_end_date_time, end_date_time, &end_time_ms);
diff_s = difftime(ret_end_date_time, ret_start_date_time);
// convert to milliseconds
diff_ms = (diff_s * 1000) + (end_time_ms - start_time_ms);
return diff_ms;
void create_tm(time_t *ret_time, const char* date_time, int *ret_time_ms)
struct tm time;
time_t otherTime;
int y,M,d,h,m,s;
int ms;
sscanf(date_time, "%4d%2d%2dT%2d%2d%2d.%3dZ", &y, &M, &d, &h, &m, &s, &ms);
time.tm_year = y - 1900; // Year since 1900
time.tm_mon = M - 1; // 0-11
time.tm_mday = d; // 1-31
time.tm_hour = h; // 0-23
time.tm_min = m; // 0-59
time.tm_sec = s; // 0-61 (0-60 in C++11)
time.tm_isdst = -1; // let mktime check for DST
*ret_time = mktime(&time);
*ret_time_ms = ms;
这将为您提供以下输出:
日期/时间差(毫秒)= 998.000000
【讨论】:
重要:missingtime.tm_isdst = something;
设置。建议-1。一些细节:检查sscanf()
的结果在这里很重要。使用当前格式,未测试最终 Z
的确定性。 ISO 8601 年不一定限于 4 位数字。将int
用于int subtract_dates()
可以很容易溢出- 可能是long long
或者只使用difftime()
的双倍。以上是关于在 C 中计算两个 ISO 8601 日期(包括毫秒)之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
在django tables2中解析ISO 8601日期格式