我正在尝试制作一个算法,如果一年是闰年,并且还要让它识别每个月的天数,以便我们有例如2001年12月31日,时间是23:59 :00我们加一分钟,我们将获得1月2002 00:00:00。但是脚本似乎有问题并且结果不对。这是一个函数的算法,但我也想把它放在用户可以使用编辑框编写日期的指南中。这种情况下的问题是如果用户按第44天放置的情况会发生的情况。算法仅在日期大于30,31,28,29且考虑第1天时才考虑。另一个问题是如果用户放置小时= 0,在我的函数中我有小时是0,天=天+ 1.由于我有一个tspan并且算法应该基于min,h,day的第二次转换工作,所以条件被放了..可以有人提供我对这个问题的一些指导,我试图避免?对于用户输入的问题,我正在考虑一条通知消息或某些不允许用户为该月放置更大值的内容。
t=3600;
year=2001;
anb=0; %leap year
%condition for leap year
if mod(year,4)~=0
anb=0;
else if mod(anb,100)~=0
anb=1;
else if mod(anb,400)~=0
anb=0;
else anb=1;
end
end
end
month= 12;
day=28;
hour=23;
min=25;
sec=17;
sec = sec + rem(t, 60);
min = rem(min + floor(t/60), 60);
hour = rem(hour + floor(t/3600), 24);
%conditions
if hour==0
day=day+1;
end
if (anb==1 && month==2 && day >29)
month=3;
day=1;
else if anb==0 && month==2 && day>28
month=3;
day=1;
end
end
if month==1||3||5||7||8||10 && day>31
month=month+1
day=1
else if month==4||6||9||11 && day>30
month=month+1
day=1
else if month==12 && day>31
year=year+1
month=1
day=1
end
end
end
答案 0 :(得分:1)
自己写这篇文章是不值得的。处理闰秒,闰年,以及所有这些都非常痛苦。听起来datenum
和datevec
可以满足您的需求。需要注意的一点是datenum
使用天数作为单位来解释下面secPerDay
的用法。
secPerDay = 60*60*24;
Y = 2001;
M = 12;
D = 31;
H = 23;
MN = 59;
S = 0.0;
n = datenum(Y,M,D,H,MN,S);
% add 60 seconds to the date
n1 = n + 60 / secPerDay;
% convert back to year, mon, day, hour, minute, second
[Y1,M1,D1,H1,MN1,S1] = datevec(n1);
<强>结果
Y1 = 2002
M1 = 1
D1 = 1
H1 = 0
MN1 = 0
S1 = 0
另请注意datenum
以直观的方式处理不正确的输入(至少在MATLAB2016b中显示)。
secPerDay = 60*60*24;
Y = 2001;
M = 12;
D = 42; % Ah yes, I have fond memories of December 42nd, 2001...
H = 23;
MN = 59;
S = 0.0;
% fix the date using datenum & datevec
n = datenum(Y,M,D,H,MN,S);
[Y,M,D,H,MN,S] = datevec(n);
<强>结果
Y = 2002
M = 1
D = 11
H = 23
MN = 59
S = 0
如果您想要两个日期之间的秒数,只需减去日期。
secPerDay = 60*60*24;
dt = (datenum(2002,1,1,0,0,0) - datenum(2001,12,31,23,59,0)) * secPerDay
<强>结果
dt = 60.0000