Matlab 我如何制作一个算法,为年、月、日、h、min、s提供正确的值?

Matlab 我如何制作一个算法,为年、月、日、h、min、s提供正确的值?,matlab,matlab-figure,Matlab,Matlab Figure,我正在尝试做一个算法,如果一年是闰年,那么它会计数,并且让它识别每个月的天数,例如2001年12月31日,时间是23:59:00,加上一分钟,我们将得到2002年1月1日00:00:00。但脚本似乎有问题,结果也不正确。这是一个函数的算法,但我也想把它放在指南中,用户可以使用editbox编写日期。这种情况下的问题是,如果用户将第44天作为示例,则算法仅在该天大于30、31、28、29时才考虑,并将该天设为第1天。另一个问题是,如果用户将小时数设置为0,则在我的函数中,小时数为0,天=天+1。之

我正在尝试做一个算法,如果一年是闰年,那么它会计数,并且让它识别每个月的天数,例如2001年12月31日,时间是23:59:00,加上一分钟,我们将得到2002年1月1日00:00:00。但脚本似乎有问题,结果也不正确。这是一个函数的算法,但我也想把它放在指南中,用户可以使用editbox编写日期。这种情况下的问题是,如果用户将第44天作为示例,则算法仅在该天大于30、31、28、29时才考虑,并将该天设为第1天。另一个问题是,如果用户将小时数设置为0,则在我的函数中,小时数为0,天=天+1。之所以设置此条件,是因为我有一个tspan,并且算法应基于以分钟、小时、天为单位的秒数转换。。有没有人能给我一些指导,让我来解决这些我试图避免的问题?对于用户输入的问题,我想到了一条通知消息或者一些不会让用户在那个月输入更大值的东西

 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

这不值得你自己写。处理闰秒、闰年和所有这些都是一件痛苦的事情。听起来datenum和datevec可以满足您的需求。需要注意的一点是datenum使用天作为单位,这解释了下面secPerDay的用法

为日期添加时间 结果

日期不当 还请注意,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);
结果

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

secPerDay = 60*60*24;
dt = (datenum(2002,1,1,0,0,0) - datenum(2001,12,31,23,59,0)) * secPerDay
结果


为什么不使用MATLAB的日期处理函数,比如datenum?因为输出将用于查找julian日期,以便使用另一种算法计算太阳的位置。datenum将其保存为“24-Oct-2003 12:45:07”。这是一个迭代,时间从0秒到72000秒。如果你也计划处理闰秒,你会有很大的痛苦。我会采纳上面的建议并使用现有的实现。你将无法做出任何像那样精确的事情。使用datenum,您可以获得从您选择的任何日期起经过的秒数,从中您可以计算太阳的位置。您还可以使用易于使用的值获取日期和时间。MATLAB有一个elseif关键字。使用else-if编写代码的方式让人有点难以理解。
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