【问题标题】:Logic behind adding dates in C在 C 中添加日期背后的逻辑
【发布时间】:2014-08-08 02:35:28
【问题描述】:

我想给一个日期加上 x 天。 有人可以帮助我的逻辑,尤其是在特定日期添加 x 天。 它似乎在添加的天数很少,但如果我添加大量天数,它就会开始给出非常有趣的答案。

也请不要函数,只是逻辑。

int
main(int argc, char *argv[]) {


int dd, mm, yyyy, daysthismonth, days, option;

printf("Please enter a date in the following format: dd/mm/yyyy:\n");
if(scanf("%d/%d/%d",&dd,&mm,&yyyy)!= 3){
    printf("Please enter a valid date\n");
    exit(EXIT_FAILURE);

/* Calculating days in a month */
}
if((mm == 4)|| (mm == 6) || (mm == 9) || (mm == 11)){
    daysthismonth = 30;
}

else if((mm == 2)){
    if((yyyy%4 == 0) && ( (yyyy%100 == 0) || (yyyy%400 == 0))){
        daysthismonth = 29;
    }
    else{
        daysthismonth = 28;
    }
}

else {
    daysthismonth = 31;
}

/* Calculating the validity of User Input */
if( (dd<0) || (dd>daysthismonth) || (mm<0) || (mm>12) || (yyyy < 0) || (yyyy>9999) ){
    printf("Plase enter a valid date between from a day from 0 AD to 9999 AD\n.");
}

printf("Todays date:        %02d/%02d/%04d\n"
        "How many days would you like to go in the future? \n",dd,mm,yyyy);
    if(scanf("%d",&days) != 1){
        printf("Please enter a valid input\n");
    }
    printf("The date %d days in the future is:\n",days); 

    while(days > (daysthismonth - dd)){
        mm = mm + 1;
        days = days - (daysthismonth - dd);

        if( days < daysthismonth){
            dd = days;
        }

        if( mm>12){
        mm = 1;
        yyyy = yyyy + 1; 
        }

    }   

    dd = dd + days;

    }

    printf("            %02d/%02d/%04d\n",dd,mm,yyyy);  

    exit(EXIT_SUCCESS);
    }

我想我的逻辑是,如果您添加了大量天数,它将减去下个月的天数,直到您达到要添加的天数少于该月天数的地步。届时,日期可能就是您必须添加的日期。

这就是为什么我实施了一段时间?循环,以便它可以重复

已编辑:scanf() != 1

【问题讨论】:

  • 请修正格式。
  • 为什么要执行一些计算然后验证用户输入?验证应该是第一位的。无论结果如何,您都使用输入。
  • 没有功能?创建它们是为了在 C 中组织一个人的想法!
  • 根本不理解您的while 循环。那里肯定有一些错误。
  • @pyrons:用铅笔和一张纸来做,你就会发现问题所在。学习编程的最好方法是从学习如何成为一台计算机开始:)

标签: c date logic


【解决方案1】:

只需将您的日/月/年存储到struct tm,在其上调用mktime() 以转换为纪元秒,添加days*24*60*60 以推进它,然后在其上调用localtime_r()(或localtime())结果再次获得日/月/年。

注意夏令时:您可能应该将小时部分设置为中午,以避免在 DST 更改时增加或减少一天的任何可能性。

【讨论】:

  • OP 正在尝试自己开发逻辑。
【解决方案2】:

所以您想在日期上添加天数。

简单的逻辑是将日期转换为天,添加 x 天,然后将天转换为日期。

复杂的逻辑就是像数学一样做加法

 yyyy/mm/dd
+        dd
-----------
     result 

就像在数学中一样,数字只能是 0-9,这里的日期/月份/年份必须基于其余部分有效。

将您想要添加的日期转换为添加之前的日期,然后在使有效之前添加可以提供帮助。

javascript中的示例(以便您可以在浏览器的控制台上轻松运行)

function daysInMonth(month,year){
    // Does not matter how you make this function
    return new Date(year, month, 0).getDate();
}

var year = 2014;
var month = 8;
var day = 8;
var daysToAdd = 123434;

day += daysToAdd;

var maxDay = daysInMonth( month, year);
while( day>maxDay ){

    day -= maxDay;
    month += 1;
    if(month==13){
        month = 1;
        year += 1;
    }

    maxDay = daysInMonth( month, year);
}

console.log(day+'/'+month+'/'+year);

它就像一个魅力:)

C 代码(请求后):

#include <stdio.h>

main(){
    // Init the variables we use
    int year = 0;
    int month = 0;
    int day = 0;
    int maxDay = 0;
    int daysToAdd = 0;

    // Ask user for a date
    printf("Please enter a date in the following format: dd/mm/yyyy:\n");
    // Validate data
    while( scanf( "%d/%d/%d", &day, &month, &year)!= 3 || day<=0 || month<=0 || year<0 || daysInMonth(month,year)<day ){
        printf("Please enter a valid date.\n");
    }

    // Ask user for days to add
    printf("Please enter days to add: \n");
    // Validate data
    while( scanf( "%d", &daysToAdd)!= 1 || daysToAdd<=0 ){
        printf("Please enter a positive number.\n");
    }

    // Calculate date

    day += daysToAdd;
    maxDay = daysInMonth( month, year);
    while( day>maxDay ){

        day -= maxDay;
        month += 1;
        if(month==13){
            month = 1;
            year += 1;
        }

        maxDay = daysInMonth( month, year);
    }

    printf("Result date : %d/%d/%d", day, month, year);

    return(0);
}

// Get days in the month
int daysInMonth( int month, int year){
    if( month==4 || month==6 || month==9 || month==11 ){
        return 30;
    }else if( month== 2 ){
        if( year%4==0 && ( year%100==0 || year%400==0) )
            return 29;
        else
            return 28;
    }else{
        return 31;
    }
}

在线测试链接:http://ideone.com/CGXgtP

编码愉快。

【讨论】:

  • 如果您添加大量天数,您就不能继续添加。您需要计算下个月的天数,这也可能取决于您所在的年份(闰年/非闰年)。
  • 是的,我同意。与在 09 = 11 上加 2 相同。出现 1。
  • 如何让它在 C 中工作?我真的不知道 daysinmonth(month, year) ...
  • 非常感谢;最后我得到了这个:。而(天>(天这个月 - dd)){ mm = mm + 1;天 = 天 - (daysthismonth);如果(毫米> 12){毫米= 1; yyyy = yyyy + 1; } } dd = dd + 天;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多