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

问题描述 投票:0回答:1

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

日期不当

另请注意,qazxsw poi以直观的方式处理不正确的输入(至少在MATLAB 2016b中看来)。

datenum

结果

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);

两个日期之间的时间

如果您想要两个日期之间的秒数,只需减去datenums。

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
© www.soinside.com 2019 - 2024. All rights reserved.