如何制作能够为年,月,日,h,分钟,s提供正确值的算法?

时间:2018-02-25 20:44:45

标签: matlab matlab-figure

我正在尝试制作一个算法,如果一年是闰年,并且还要让它识别每个月的天数,以便我们有例如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

1 个答案:

答案 0 :(得分:1)

自己写这篇文章是不值得的。处理闰秒,闰年,以及所有这些都非常痛苦。听起来datenumdatevec可以满足您的需求。需要注意的一点是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