【发布时间】: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
我想创建一个到 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
这是我想出的一个小技巧。通过计算 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(2015, 3, 0)。当然,还有解释这种疯狂的评论。
datenum(2015, 3, 1) - 1 更适合表达意图。
无论好坏,Datenum 都采用负数和零数。所以二月的最后一天可以写成:
datenum(2015, 3, 0)
当然还有解释这种疯狂的评论。
【讨论】: