我怎样才能制定一个算法来为我提供年、月、日、h、min、s 的正确值?

How can I make an algorithm that can give me the right values for year, month,day ,h,min,s?

我正在尝试制作一个算法,如果年份是闰年,它会计算,并且让它识别每个月的天数,例如 2001 年 12 月 31 日,时间是 23:59:00 并且我们添加一分钟我们将获得 1 jan 2002 00:00:00 。但是脚本似乎有问题并且结果不是 right.This 是一个函数的算法,但我也想把它放在用户可以使用编辑框编写日期的指南中。这种情况下的问题是如果用户输入第 44 天会发生什么,该算法仅在该天大于 30、31、28、29 时考虑并将该天设为 1。另一个问题是如果用户输入hour =0 ,在我的函数中我有 hour is 0 , day=day+1.THis 条件是因为我有一个 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

自己写这个不值得。处理闰秒、闰年以及所有这些都是相当痛苦的。听起来 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