2014-11-07 903 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结构体。
相关问题