我正在编写一个用c ++保存日期的类,我发现了以下问题:
我N
自参考日期(在我的情况下将是公元0001年1月1 日)以来有多天,包括自参考日以来经过的闰日.我怎么能转换这个数字到一年Y
,月M
和日D
有效?
我想尽可能高效地完成这项工作,因此最佳实现显然会具有O(1)复杂性.
接下来的部分将解释我已经学到的一些东西.
要确定一年是否跳跃,有一些规则:
这将转换为这样的代码:
bool IsLeapYear(int year)
{
// Corrected after Henrick's suggestion
if (year % 400 == 0) return true;
if ((year % 4 == 0) && (year % 100 != 0)) return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
计算一年前飞跃多少年的有效方法是:
int LeapDaysBefore(int year)
{
// Years divisible by 4, not divisible by 100, but divisible by 400
return ((year-1)/4 - (year-1)/100 + …
Run Code Online (Sandbox Code Playgroud) 我无法理解为什么tm
C++中的结构以这种方式运行.让我更具体一点 - 如果我要获得当前时间,我可能会做这样的事情
time_t now = time(0);
tm *nowTm = gmtime(&now);
Run Code Online (Sandbox Code Playgroud)
在打印出日期后,我期待类似的事情2015/06/13
(截至本文的当前日期)
cout << nowTm->tm_year << "/" << nowTm->tm_mon << "/" << nowTm->tm_mday;
Run Code Online (Sandbox Code Playgroud)
但相反,我发现它打印出来了1150/5/13
.对于月份值,我只需添加1即可将其设置为正确的月份,但玩弄这一年证明很麻烦.
我遇到过这个SO帖子:从日期中添加或减去天数的算法?据说从年份中减去1900以获得正确的年份.我试过没有用.
然后我尝试添加当前年份和1150之间的差异,2015 - 1150 = 865
以获得正确的一年,但它给了我9800
而不是2015
.
然后,我尝试添加一年,并发现
我很困惑 - 为什么会发生这种情况,如何在我的tm
结构中获得正确的年份?