我怎样才能制定一个算法来为我提供年、月、日、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
自己写这个不值得。处理闰秒、闰年以及所有这些都是相当痛苦的。听起来 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
我正在尝试制作一个算法,如果年份是闰年,它会计算,并且让它识别每个月的天数,例如 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
自己写这个不值得。处理闰秒、闰年以及所有这些都是相当痛苦的。听起来 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