相关疑难解决方法(0)

将天数转换为年数(包括闰年)的高效算法

问题

我正在编写一个用c ++保存日期的类,我发现了以下问题:

N自参考日期(在我的情况下将是公元0001年1月1 日)以来有多天,包括自参考日以来经过的闰日.我怎么能转换这个数字到一年Y,月M和日D有效

我想尽可能高效地完成这项工作,因此最佳实现显然会具有O(1)复杂性.

接下来的部分将解释我已经学到的一些东西.

闰年

要确定一年是否跳跃,有一些规则:

  1. 可被4整除的年份是飞跃
  2. 规则1的例外:可以被100整除的年份不是跳跃
  3. 规则2的例外:可以被400整除的年份是飞跃

这将转换为这样的代码:

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)

c++ algorithm time

12
推荐指数
2
解决办法
1万
查看次数

不明白tm_struct(C++)计算 - 是否存在某种偏移?

我无法理解为什么tmC++中的结构以这种方式运行.让我更具体一点 - 如果我要获得当前时间,我可能会做这样的事情

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.

然后,我尝试添加一年,并发现

  1. 如果我今年+1,它会以10年为增量上升.
  2. 如果I +0.1到年份,则将日期除以零并将其加0.1(例如1150 + 1 = 115.01).

我很困惑 - 为什么会发生这种情况,如何在我的tm结构中获得正确的年份?

c++ datetime date

2
推荐指数
1
解决办法
156
查看次数

标签 统计

c++ ×2

algorithm ×1

date ×1

datetime ×1

time ×1