Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C计算两个ISO 8601日期(包括毫秒)之间的差值_C_Linux_Date_Time - Fatal编程技术网

用C计算两个ISO 8601日期(包括毫秒)之间的差值

用C计算两个ISO 8601日期(包括毫秒)之间的差值,c,linux,date,time,C,Linux,Date,Time,我有两个ISO 8601格式的日期: 20170423T221118.585Z 20170423T221119.583Z 在使用核心语言库的Linux in C上,如何计算这两个日期之间的毫秒差?使用核心C语言执行以下操作: #include <stdio.h> #include <time.h> double subtract_dates(const char *start_date_time, const char *end_date_time); void cre

我有两个ISO 8601格式的日期:

20170423T221118.585Z

20170423T221119.583Z


在使用核心语言库的Linux in C上,如何计算这两个日期之间的毫秒差?

使用核心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;
}
#包括
#包括
双减法日期(常量字符*开始日期时间,常量字符*结束日期时间);
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”;
双msdiff;
msdiff=减去日期(结束日期时间、开始日期时间);
printf(“日期/时间差(毫秒)=%f\n”,msdiff);
}
双减法日期(常量字符*结束日期时间,常量字符*开始日期时间)
{
时间\重新开始\日期\时间;
时间返回日期时间;
双差;
整数开始时间;
int end_time_ms;
双差分法;
创建\u tm(&ret\u start\u date\u time、start\u date\u time和start\u time\ms);
创建\u tm(&ret\u end\u date\u time、end\u date\u time和end\u time\ms);
diff_s=difftime(返回结束日期时间、返回开始日期时间);
//转换为毫秒
差异时间=(差异时间*1000)+(结束时间-开始时间);
返回差异;
}
void create_tm(time_t*ret_time,const char*date_time,int*ret_time_ms)
{
结构时间;
时间——其他时间;
int y,M,d,h,M,s;
int-ms;
sscanf(日期和时间,“%4d%2d%2dT%2d%2d%2d%2d.%3dZ”、&y、&M、&d、&h、&M、&s、&ms);
time.tm_year=y-1900;//自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(C++11中的0-60)
time.tm_isdst=-1;//让mktime检查DST
*ret_time=mktime(&time);
*返回时间=毫秒;
}
这将为您提供以下输出:


日期/时间差(ms)=998.000000使用核心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;
}
#包括
#包括
双减法日期(常量字符*开始日期时间,常量字符*结束日期时间);
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”;
双msdiff;
msdiff=减去日期(结束日期时间、开始日期时间);
printf(“日期/时间差(毫秒)=%f\n”,msdiff);
}
双减法日期(常量字符*结束日期时间,常量字符*开始日期时间)
{
时间\重新开始\日期\时间;
时间返回日期时间;
双差;
整数开始时间;
int end_time_ms;
双差分法;
创建\u tm(&ret\u start\u date\u time、start\u date\u time和start\u time\ms);
创建\u tm(&ret\u end\u date\u time、end\u date\u time和end\u time\ms);
diff_s=difftime(返回结束日期时间、返回开始日期时间);
//转换为毫秒
差异时间=(差异时间*1000)+(结束时间-开始时间);
返回差异;
}
void create_tm(time_t*ret_time,const char*date_time,int*ret_time_ms)
{
结构时间;
时间——其他时间;
int y,M,d,h,M,s;
int-ms;
sscanf(日期和时间,“%4d%2d%2dT%2d%2d%2d%2d.%3dZ”、&y、&M、&d、&h、&M、&s、&ms);
time.tm_year=y-1900;//自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(C++11中的0-60)
time.tm_isdst=-1;//让mktime检查DST
*ret_time=mktime(&time);
*返回时间=毫秒;
}
这将为您提供以下输出:

日期/时间差(ms)=998.000000

重要提示:
time.tm_isdst=something设置。建议-1。一些细节:检查
sscanf()
的结果在这里很重要。对于当前格式,不测试最终
Z
的确定性。ISO 8601年份不一定限于4位数字。使用
int
进行
int减法日期()
很容易溢出-可能是
long
或者只是使用
difftime()的两倍。重要提示:
time.tm\u isdst=something设置。建议-1。一些细节:检查
sscanf()
的结果在这里很重要。对于当前格式,不测试最终
Z
的确定性。ISO 8601年份不一定限于4位数字。使用
int
进行
int减法日期()
很容易溢出-可能是
long
或者只使用
difftime()的两倍。