我想创建一个直到二月底的日期列表。但是,由于 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 或 0 logical
MATLAB 约定导致了黑客的第二部分:这正是您需要添加到 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)
当然,用评论来解释这种疯狂。