在C语言中比较日期大小的方法

9
我想知道如何使用C程序查找哪个日期更大。请帮我解决这个问题。

6
你是如何获取这些日期的? - user142162
5
比较 sizeof(date1) > sizeof(date2) 可以告诉你哪个更大,或者将日期与我结婚纪念日进行比较,那对我来说是个重要的日子。通常比较日期的方法是早一点还是晚一点,因为大小取决于从哪里开始计算,并不一定有意义。 - Pete Kirkham
5个回答

17
你可以使用 difftime 函数:
#include <time.h>
#include <stdio.h>

int main(void) {
  time_t date1, date2;
  // initialize date1 and date2...

  double seconds = difftime(date1, date2);
  if (seconds > 0) {
    printf("Date1 > Date2\n");
  }

  return 0;
}
如果你的日期不是 time_t 类型,你可以使用函数 mktime 进行转换。

1
你正在比较时间而不是日期。 - Sany

4
#include <stdio.h>

struct date 
{
   int month;
   int date;
   int year;
};


int main(void)
{
    int i=compare_dates (struct date d1, struct date d2);
    switch(i)
    {
       case -1:
         printf("%d/%d/%d is earlear date than %d/%d %d", D1.day, D1.month, D1.year, D2.day
       case 1: 
         printf("%d/%d/%d is later date than %d/%d/%d",D1.day,D1.month,D1.year,D2.day…
       case 0: 
         printf("%d/%d/%d is the same date than %d/%d/%d", D1.day, D1.month, D1.year, D2.day
     }
   return 0;
}


int compare_dates (struct date d1, struct date d2)
{
    if (d1.year < d2.year)
       return -1;

    else if (d1.year > d2.year)
       return 1;

    if (d1.year == d2.year)
    {
         if (d1.month<d2.month)
              return -1;
         else if (d1.month>d2.month)
              return 1;
         else if (d1.day<d2.day)
              return -1;
         else if(d1.day>d2.day)
              return 1;
         else
              return 0;
    }
}

如果 (d1.year = d2.year) 的话,应该用 == 呀 :-) - Bernd Elkemann
4
这段函数中的if (d1.year == d2.year)是否多余?因为如果程序执行到这里,你就已经知道年份是相同的了。 - gsamaras

2
如果你只是想知道哪个更大,那么你不需要经历所有这些步骤。你只需要对月份和年份赋予比最大日期可能性还要高的系数,然后进行比较。例如,假设一个月比一天重要100倍,一年比一天重要2000倍。计算日期的分数并进行比较即可。
#include <stdio.h>

int main()
{
    int day1, day2, month1, month2, year1, year2;

    printf("Enter first date (dd/mm/yyyy) => "); scanf("%d/%d/%d", &day1, &month1, &year1);
    int prioritedScore1 = day1 + month1*100 + year1*2000;
    printf("Enter second date (dd/mm/yyyy) => "); scanf("%d/%d/%d", &day2, &month2, &year2);
    int prioritedScore2 = day2 + month2*100 + year2*2000;

    if(prioritedScore1 > prioritedScore2){
        printf("Bigger date is => %d/%d/%d", day1, month1, year1);
    } else if(prioritedScore2 > prioritedScore1){
        printf("Bigger date is => %d/%d/%d", day2, month2, year2);
    } else{
        printf("Dates are same.");
    }

    return 0;
}

当用户输入像2147484这样的很大的数字时,您可以始终使用长整型来消除可能出现的错误。


1

您能否提供更多关于您想要实现的内容的信息?因为比较日期真的很容易。毕竟,它们只是自某个过去日期以来的秒数(或毫秒、微秒、纳秒等),或者包含年、月、日等结构。无论格式如何,比较都应该很容易执行。

也许您想要比较用户提供的两个日期字符串(类似于“2011-03-12 18:38”)?那么,您可以使用strptime将字符串转换为struct tm,然后进行比较。

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int parse_date(char* date, struct tm* tm)
{
    char* format;
    char* formats[] = {
        "%F %I", /* "2011-03-12 06:38:05 AM" */
        "%F %T", /* "2011-03-12 18:38:05" */
        "%F %R", /* "2011-03-12 18:38" */
        NULL,
    };

    for (format = formats[0]; format; ++ format) {
        if (strptime(date, format, &tm)) {
            return 1;
        }
    }

    return 0;
}

int main(int argc, char** argv)
{
    float diff;

    char* date1;
    char* date2;

    struct tm tm1;
    struct tm tm2;

    time_t time1;
    time_t time2;

    if (argc != 3) {
        fprintf(stderr, "usage: compare-date date1 date2\n");
        exit(1);
    }

    date1 = argv[1];
    date2 = argv[2];

    if (!parse_date(date1, &tm1)) {
        fprintf(stderr, "unsupported date: %s\n", date1);
        exit(1);
    }

    if (!parse_date(date2, &tm1)) {
        fprintf(stderr, "unsupported date: %s\n", date2);
        exit(1);
    }

    time1 = mktime(&tm1);
    time2 = mktime(&tm2);
    diff = difftime(time1, time2);

    printf("%s %c %s\n",
        date1,
        (diff < 0 ? '<' : (diff > 0 ? '>' : '==')),
        date2);

    return 0;
}

0

你没有说日期的格式是什么,所以我会举两个常见的例子:

  • 如果您正在使用GNU lib-c(或MinGW)并查询时间:

    time_t time (time_t *result)
    

    那么time_t只是一个long int,自epoch以来的秒数,您可以从另一个日期中减去一个日期,以找出秒数差异。

  • 如果您正在使用Windows API并具有filetime结构:

    typedef struct _FILETIME {
        DWORD dwLowDateTime;
        DWORD dwHighDateTime;
    } FILETIME, *PFILETIME;
    

    您可以将指针强制转换为指向ULARGE_INTEGER的指针,并将其减去,从而得到100纳秒间隔差异的数量。


time_t 在 Windows 编译器上同样有效。你的回答让我误以为在 Visual C++ 编译器中不可用... - rubenvb
@rubenvb 是的,这只是一些例子。 - Bernd Elkemann
time_t是标准C89中的一种类型,因此被MSVC和Unix C编译器支持。虽然有许多不同的亚秒时间结构。 - Jonathan Leffler
这只是例子而已。我们只需等待OP最终告诉我们他如何查询日期;或许他会告诉我们他使用一个包含用罗马数字编码的玛雅历法日期的字符串 :-) - Bernd Elkemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接