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程序员。
答案 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)
感谢大家的所有投入,这就是我最终要做的事情。