簡體   English   中英

在C中添加日期的邏輯

[英]Logic behind adding dates in C

我想將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

因此,您想添加日期。

簡單的邏輯是將日期轉換為天,添加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

快樂的編碼。

只需將您的日/月/年存儲到struct tm ,在其上調用mktime()即可將其轉換為紀元秒,然后添加days*24*60*60擴展,然后在上調用localtime_r() (或localtime() )結果再次獲得日/月/年。

請注意夏令時:您可能應該將小時部分設置為正午,以免DST更改時增加或損失一天的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM