程序员 - c语言 日期差值无法通过?

查看:96
本文介绍了程序员 - c语言 日期差值无法通过?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

这是问题http://ac.jobdu.com/problem.p...

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
    struct tm t1;
    struct tm t2;
    int y1, m1, d1;
    int y2, m2, d2;
    while(scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {
        scanf("%4d%2d%2d", &y2, &m2, &d2);


        t1.tm_mday = d1;
        t1.tm_mon = m1;
        t1.tm_mon--;
        t1.tm_year = y1;
        t1.tm_year -= 1900;
        t2.tm_mday = d2;
        t2.tm_mon = m2;
        t2.tm_mon--;
        t2.tm_year = y2;
        t2.tm_year -= 1900;
        t1.tm_sec = 0;
        t1.tm_min = 0;
        t1.tm_hour = 0;
        t1.tm_isdst = -1;
        t2.tm_sec = 0;
        t2.tm_min = 0;
        t2.tm_hour = 0;
        t2.tm_isdst = -1;

        int k1 = mktime(&t1);
        int k2 = mktime(&t2);

        int k3 = (k1 - k2) / 3600 / 24;
        if (k3 < 0) {
            k3 = -k3;
        }
        printf("%d\n", k3 + 1);
    }
    return 0;
}

我自己电脑上运行正确,可OJ无法通过,求大神指教。

解决方案

这个题目出真是简单粗暴。
不建议用mktime,因为mktime有时间范围限制,如果时间表示不了,会返回-1的。
比如32位Linux中,只能到2038年,64位的则可以到3000年。
此外有些实现(如VC++)对于Unix Epoch(1970年1月1日午夜)之前的时间会也会返回-1。
所以你最好还是自己处理。题目的意思应该是让你把年月日分别相减,并相互借位。

其实这道题仔细追究会有很多问题的,毕竟不严谨。
比如公元46年到1582年使用的是儒略历,之后用的是格高里历,两者切换的1582年10月份,有些日期其实是不存在的等。

这篇关于程序员 - c语言 日期差值无法通过?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆