2016-08-02 103 views
0

我無法想象如何爲日期添加值。想象一下,我有一個像2012-5-15的日期。在我解析它之後,我分別獲得了年,月和日,並且試圖通過使用time_t和mktime將它轉換爲我的確切日期。我是否有機會將其轉換回我找到的日期或秒數?這是我的代碼的一部分,試圖做到這一點;C++加上或減去日期的值

if(operation="+"){ 
    tm tm1=make_tm(year,mon,day); 
    time_t time1=mktime(&tm1); 
    int seconds_per_day=60*60*24; 
    time_t second=time1/seconds_per_day; 
    int sum=second //Trying to convert to the int from my time_t, don't know  
        //if it is neccesary 
    sum=sum+value //the value I want to add 

所以,基本上如果我給像2012/5/15這樣的輸入。它使用該方法計算它傳遞了多少天,但我只需要將其轉換爲日期並顯示。你有什麼主意嗎?

+0

time_t是自epoc(1970年1月1日,00:00:00 UTC)以來的秒數。見[this](http://linux.die.net/man/2/time) – user3159253

+0

對不起,如果這是相關的,但如果你使用了''庫,你已經爲類定義了運算符'+' 。 –

+0

是的,我把它轉換成了之後的日子,並把它存儲爲一天。然後,我增加了我的價值到那一天。我可以看到我的日期爲天數,但我需要再次將其轉換爲日期(YYYY-M-D) –

回答

2

如果你問的方式來天添加到一個特定的日期,這裏是一個辦法做到這一點的類似條款的嘗試:

tm addDays(tm t1, int days) 
{ 
    time_t epoch = mktime(&t1); 
    epoch += (60*60*24 * days); 
    return *localtime(&epoch); 
} 

然後使用返回tm結構和訪問tm_yeartm_montm_mday成員獲得yyyymmdd需要的輸出。一個非常粗略的和現成的例子(沒有正確的格式):

tm t1; 
std::fill((char*)&t1, (char*)&t1 + sizeof(t1), 0); 
t1.tm_year = 2016; 
t1.tm_mon = 8; 
t1.tm_mday = 2; 

auto result = addDays(t1, 30); 

std::cout << result.tm_year << '/' << result.tm_mon << '/' << result.tm_mday << std::endl; 
1

這裏是一個free, open-source C++11/14 library做你想要用非常漂亮的語法,以及無與倫比的性能是什麼。

#include "date.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    year_month_day x = sys_days{2012_y/may/15} + days{55}; 
    std::cout << x << '\n'; 
} 

此輸出:

2012-07-09 

如果您希望這個自己編寫,here are the algorithms此日期庫使用。但是日期庫以類型安全的方式包裝所有東西,在編譯時捕獲許多錯誤。

日期庫也無非是<chrono>庫擴展的更多,所以是非常兼容:

#include "date.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono_literals; 
    auto x = sys_days{2012_y/may/15} + days{55} + 7h + 30min; 
    std::cout << x << '\n'; 
} 

2012-07-09 07:30 
0

謝謝大家的關注,但我以另一種方式想通了這個問題。這是我的方式;

tm tm1=make_tm(year,mon,day);//of course I had an make_tm as struct 
time_t time1=mktime(&tm1); 
time1=time1+value*86400-86400 //because it was a second, I needed to convert the day to second. Then, I don't know why but it showed extra one day. So, again I subtracted 86400 then the problem solved. 
char *cb=ctime(&time1); 
cout<<cb<<endl;