2014-11-07 899 views
1
typedef struct dbdatetime 
{      // Internal representation of DATETIME data type 
LONG dtdays;  // No of days since Jan-1-1900 (maybe negative) 
ULONG dttime;  // No. of 300 hundredths of a second since midnight 
} DBDATETIME; 

我試圖將此結構轉換爲今天的日期。我不懷疑時間會給我帶來很多麻煩,但我在將總天數轉換爲正確的月份和日期的邏輯上存在問題。將1900年1月1日以來的天數轉換爲今天的日期

Ex。 11月7日星期五是41948天。

你可以用365.2425 + 1900除以得到當前年份,但是如何得到正確的月份/日期。

C是否有內置任何東西來處理這個問題?我不是貿易的C程序員。

+0

你肯定不想手工做這個。正確的做法非常棘手,而且有很多邊緣案例。我不記得要調用的庫函數,但這就是你需要做的。 – StilesCrisis 2014-11-07 01:30:08

+0

如果你想推出自己的代碼 - 一個有趣的任務 - 假裝年度結束於二月。 (它過去在2000年前的2月結束,_Octo_ber是第8個月,_Dece_mber是第10個月),然後閏年在今年年底。建議從2000年3月1日起計算 – chux 2014-11-07 03:07:23

回答

0

正如你所說,你可以將天數除以365.2425得到一年的估計值。一旦你有了,使用1900年和那年之間的年數和閏年來計算到那一年的天數。

您需要確保檢測閏年的邏輯是正確的。一旦你知道哪些年份是閏年,你會沒事的。例如,1900年不是閏年,即使它可以被4整除。Google閏年規則可以找出原因。

一旦你有了,剩下的日子就屬於當年。再次使用閏年邏輯來確定當前年份是否閏年。然後就是每月計算一天的問題。

0

C標準沒有直接處理這個問題,但是如果您願意編寫特定於操作系統的代碼,或者可以導入像boost::date_time這樣的庫,這是最好的選擇。不要試圖自己處理它,除非你對邊緣案例不正確。日期和時間是很難得到正確的。

以下是date_time的文檔,可以對日期進行算術運算,包括「將N天添加到1/1/1900」。 http://www.boost.org/doc/libs/1_56_0/doc/html/date_time/gregorian.html#date_time.gregorian.date_duration

date d(1900, Jan, 1) 
d += days(dtdays); 

編輯: OP不能使用升壓,但我會離開這個在這裏情況下,未來遊客可以使用信息。

+1

「C標準中沒有處理這個問題」?你的意思是像['mktime'](http://en.cppreference.com/w/c/chrono/mktime)和朋友? – 2014-11-07 01:43:39

+0

至於提升,問題被標記爲C. – 2014-11-07 01:44:27

+0

'mktime'返回一個'time_t',其中(a)是實現定義它是如何工作的,和(b)在常見實現中是1970年以來的秒數。我沒有看到你'd實際上使用它來實現他的請求。 – StilesCrisis 2014-11-07 01:44:47

0

C++是不可能的,謝謝所有的輸入傢伙。

我確實發現這個算法似乎迄今爲止工作,但現在正在測試它。

int l = nSerialDate + 68569 + 2415019; 
int n = int((4 * l)/146097); 
     l = l - int((146097 * n + 3)/4); 
int i = int((4000 * (l + 1))/1461001); 
    l = l - int((1461 * i)/4) + 31; 
int j = int((80 * l)/2447); 
nDay = l - int((2447 * j)/80); 
    l = int(j/11); 
    nMonth = j + 2 - (12 * l); 
nYear = 100 * (n - 49) + i + l; 

試圖找到它背後的一些理論。

+0

哇,真的很難得到正確的! :) – StilesCrisis 2014-11-07 01:54:34

+0

雅這個算法是接近,但似乎並不完全工作。 41948回來了:11/5/2014不是11/7/2014 – Bikeinator 2014-11-07 02:01:25

+0

順便說一句:如果你選擇使用MS Excel檢查你的工作筆記2件事情:1)1900年1月1日是第1天(不是天數_since_ Jan 1900年)和2)根據Excel的1900年2月29日存在(他們的代碼中的一個錯誤,他們拒絕修復。) – chux 2014-11-07 02:51:05

0

感謝所有人的投入,這是我最終做的。

  1. 將dtdays轉換爲秒,減去1月1日至1月19日(序列日期)和1月1日至1970年(UNIX時間)之間秒數的偏移量。這是2208988800,這給我們留下了UNIX時間。
  2. 將百分之一秒轉換爲秒並添加到總數中。
  3. 使用gmtime()將UNIX時間轉換爲tm結構體。
相關問題