将自1900年1月1日以来的天数转换为今天的日期

时间:2014-11-07 00:43:28

标签: c date datetime logic

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;

我正在尝试将此结构转换为今天的日期。我不怀疑时间会给我带来太多麻烦,但我对将总天数转换为正确的月份和日期的逻辑存在问题。

实施例。 11月7日星期五是41948天。

您可以除以365.2425 + 1900来获得当前年份,但如何获得正确的月份/日期。

C内置了什么来处理这个问题吗?我不是贸易的C程序员。

4 个答案:

答案 0 :(得分:0)

正如您所说,您可以将天数除以365.2425,以获得一年的估计值。完成后,使用1900年到该年之间的年数和闰年来计算到那一年的天数。

您需要确保检测闰年的逻辑是合理的。一旦你知道哪些年是闰年,你会没事的。例如,1900年不是闰年,即使它可被4整除。谷歌闰年规则找出原因。

一旦你有了,剩余的日子将属于当年。再次使用闰年逻辑来确定当前年份是否为跳跃。然后就是计算每个月的天数。

答案 1 :(得分:0)

C标准中没有直接处理此问题,但如果您愿意编写特定于操作系统的代码,或者可以导入boost::date_time之类的库,则这是最佳选择。除非你对边缘情况不对,否则不要试图自己处理它。众所周知,日期和时间很难正确。

以下是date_time的文档,可以对日期进行算术运算,包括“将N天添加到1900年1月1日”。 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无法使用提升功能,但我会将此保留在此处以防将来的访问者使用该信息。

答案 2 :(得分: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;

现在试着找到一些理论。

答案 3 :(得分:0)

感谢大家的所有投入,这就是我最终要做的事情。

  1. 将dtdays转换为秒,减去Jan-1-1900(Serial Date)和Jan-1-1970(UNIX Time)之间的秒数偏移量。这是2208988800,这给我们留下了UNIX时间。
  2. 将百分之一秒转换为秒并添加到总数。
  3. 使用gmtime()将UNIX时间转换为tm结构。