【问题标题】:datenum series to the end of February - Leap year or notdatenum 系列到 2 月底 - 闰年与否
【发布时间】:2015-03-05 18:08:25
【问题描述】:

我想创建一个到 2 月底的日期列表。但是,由于 2 月底会根据是否有闰年而从 28 日更改为 29 日,因此我无法同时考虑这两个选项。

这是我目前所拥有的:

date = datenum(years(i),12,01):1:datenum(years(i)+1,02,29);

本例在非闰年运行时,会计算 3 月 1 日,而不是 2 月 28 日。

【问题讨论】:

    标签: matlab date time-series


    【解决方案1】:

    这是我想出的一个小技巧。通过计算 2 月 28 日到 3 月 1 日之间的天数,您可以很容易地检查一年是否是闰年,如下所示:

    datenum(years(i), 3, 1) - datenum(years(i), 2, 28)
    

    检查它是否大于 1 表示闰年。这个 1 或 0 logical MATLAB 约定导致了破解的第二部分:这正是您需要添加到 2 月 28 日的天数:如果不是闰年,则为 0,如果是闰年,则为 1。因此,这里是完整的 hack:

    date = datenum(years(i),12,01):datenum(years(i)+1,02, ...
                   28 + ((datenum(years(i)+1,3,1) - datenum(years(i)+1,2,28))>1) );
    

    更新/改进: 答案已经被接受,但我想出了一个更好的解决方案。我没有意识到datenum 只是计算天数。在这种情况下,我们可以简单地说二月的最后一天是3 月 1 日的前一天。这产生了以下极大的简化:

    date = datenum(years(i),12,01):1:(datenum(years(i)+1,3,1)-1);
    

    【讨论】:

    • Datenum,无论好坏,也采用负数和零数。所以二月的最后一天可以写成:datenum(2015, 3, 0)。当然,还有解释这种疯狂的评论。
    • @Peter 您绝对应该将其发布为答案!
    • 好的,但仅供将来参考。老实说,我认为datenum(2015, 3, 1) - 1 更适合表达意图。
    【解决方案2】:

    无论好坏,Datenum 都采用负数和零数。所以二月的最后一天可以写成:

    datenum(2015, 3, 0)
    

    当然还有解释这种疯狂的评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多