datenum 系列到二月底 - 闰年与否

datenum series to the end of February - Leap year or not

我想创建一个到 2 月底为止的日期列表。但是,由于 2 月底会根据是否有闰年从 28 更改为 29,因此我在如何考虑这两个选项时遇到了麻烦。

这是我目前的情况:

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

这种情况下,当在非闰年的年份运行时,最终计算为 3 月 1 日,而不是 2 月 28 日。

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

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

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

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 只是计算天数。在这种情况下,我们可以简单地说,2 月的最后一天是 3 月 1 日的前一天。这产生了以下剧烈的简化:

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

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

datenum(2015, 3, 0)

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