打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MATLAB的时间与日期
7  日期和时间
MATLAB在2014b版本中将日期和时间独立成了一个数据类型,新的版本中对于时间数据的处理功能更为强大。比如datetime和duration等函数,可以支持对时间的高效计算、对比、格式化显示。对这类数组的操作方法和对普通数组的操作是基本一致的。下面我们就对主要的功能进行介绍。
7.1  创建日期和时间数组
存储日期和时间信息的最主要形式就是datatime数组,它支持代数运算、排序、比较、绘图和格式化显示。代数运算的结果通过duration数组返回,如果采用基于日历的函数进行的计算,那么返回的结果将是calendarDuration数组。Matlab提供了以下函数来进行日期及时间类型的计算,请见表3-11 。
表3-11 日期和时间函数
函    数
说    明
函    数
说    明
datetime
基于当前日期创建时间数组,或者将日期字符串或数据转换为时间数组
yyyymmdd
将MATLAB datetime数据类型转化为YYYYMMDD数值格式
years
年数长度
minutes
分钟数长度
days
天数长度
seconds
秒数长度
hours
小时数长度
duration
由数值创建duration数组
calyears
日历年数长度
calweeks
日历星期数长度
calquarters
日历季度数长度
caldays
日历天数长度
calmonths
日历月数长度
calendarDuration
由数值创建日历时间长度数组
下面我们举例来说明如何创建日期和时间数组。
【例3-41】  日期时间数组创建。
例如,如果我们想要来表示这样两个日期:June 28, 2014 at 6 a.m和June 28, 2014 at 7 a.m,那么我们可以将这些数值相应的赋值给datetime函数各元素即可:
>> t = datetime(2014,6,28,6:7,0,0)
t =
28-Jun-2014 06:00:00   28-Jun-2014 07:00:00
如果想要对数组中的某一元素进行修改,那么只需要将新的数值赋值给相应的元素即可:
>> t.Day = 27:28
t =
27-Jun-2014 06:00:00   28-Jun-2014 07:00:00
如果想要更改数组的显示格式,只需要改变Format属性即可。这一过程中改变的只是数据显示格式,数据本身没有任何改动。
>> t.Format = 'MMM dd, yyyy'
t =
Jun 27, 2014   Jun 28, 2014
如果你要将一个datetime数组减去另一个datetime数组,那么结果就是duration数组:
>> t2 = datetime(2014,6,29,6,30,45)
t2 =
29-Jun-2014 06:30:45
>> d = t2 - t
d =
48:30:45   23:30:45
在默认情况下,duration数组显示格式是“hours:minutes:seconds”。通过设置Format属性,用户可以改变显示格式。例如可以改变为单一单位“小时”,具体操作如下:
>> d.Format = 'h'
d =
48.512 hrs   23.512 hrs
用户通过使用seconds、minutes、hours、days或 years函数,也可以直接创建一个新的单一单位的duration数值。例如,创建一个2天的天数长度,也就是正好等于24小时×2:
>> d = days(2)
d =
2 days
用户通过使用caldays、calweeks、calquarters和calyears函数,也可以直接创建一个新的单一单位的calendar duration数值。例如,创建一个2个月的日历天数长度:
>> L = calmonths(2)
L =
2mo
如果将一个calendar months 和一个calendar days数值相加,那么天数数值还将会分开显示,因为每个月的天数并不一致。除非是将其和一个具体的日期时间相加。
>> L = calmonths(2) + caldays(35)
L =
2mo 35d
将一个calendar durations和一个datetime数组相加:
>> t2 = t + calmonths(2) + caldays(35)
t2 =
Oct 01, 2014   Oct 02, 2014
此时得到的t2依然是一个datetime数组。
>> whos t2
Name      Size            Bytes  Class       Attributes
t2        1x2               161  datetime
总的来说,有多种方式来表达日期和时间,MATLAB对于每一种都提供了方法(如图3-7所示):
(1)表达时间点,使用datetime数据格式。例如Wednesday, June 18, 2014 10:00:00。
(2)表达一段时间的长度,采用固定时间长度单位,使用duration数据类型。在使用此种类型的时候,1天总是等于24小时的,一年总是等于365.2425天的。例如:72 小时10分钟。
(3)表达一段时间的长度,采用可变时间长度单位,使用calendarDuration数据类型。例如1个月可以是28、29、30或者31天。另外calendarDuration还考虑了夏令时和闰年,所以1天时间可以大于或者小于24小时,1年可以是365天或者366天。
图3-7  选择需要导入的图像文件
【例3-42】  指定时区与相关计算。
在对日期和时间的计算中,MATLAB还提供了时区设置选项。这样我们只需在创建日期时间数组的时候指定好了时区,那么就可以在不同时区之间进行相关计算了,而不必人工换算中间有多少时差。下面我们就举例来说明如何来使用。
首先创建指定了时区的datetime数组:
>> t = datetime(2014,3,8:9,6,0,0,'TimeZone','local',...
'Format','d-MMM-y HH:mm:ss Z')
t =
8-Mar-2014 06:00:00 +0800   9-Mar-2014 06:00:00 +0800
在这里我们指定的是系统内部的时区设置'local',返回的结果中“+0800”一项就是我们所处的时区和Coordinated Universal Time之间的时差。
用户也可以指定时区:
>> t.TimeZone = 'Asia/Tokyo'
t =
8-Mar-2014 07:00:00 +0900   9-Mar-2014 07:00:00 +0900
同样的方式我们可以定义另一个伦敦时间:
>> u = datetime(2014,3,9,6,0,0,'TimeZone','Europe/London',...
'Format','d-MMM-y HH:mm:ss Z')
u =
9-Mar-2014 06:00:00 +0000
两个时间相减,就可以得到两个时间点相差的实际时间:
>> dt = t - u
dt =
-32:00:00    -8:00:00
【例3-43】  日期和时间序列的产生。
本例将来为读者演示如何通过使用冒号(:)来产生日期和时间序列。
采用默认步长来产生序列,默认步长为1个日历天。
>> t1 = datetime('01-Nov-2013 08:00:00');
t2 = datetime('05-Nov-2013 08:00:00');
t = t1:t2
t =
Columns 1 through 3
01-Nov-2013 08:00:00   02-Nov-2013 08:00:00   03-Nov-2013 08:00:00
Columns 4 through 5
04-Nov-2013 08:00:00   05-Nov-2013 08:00:00
用户还可以指定步长:
>> t = t1:caldays(2):t2      %  使用caldays函数来指定2个日历天为步长
t =
01-Nov-2013 08:00:00   03-Nov-2013 08:00:00   05-Nov-2013 08:00:00
>>t = t1:hours(18):t2        % 使用18个小时作为步长
t =
Columns 1 through 3
01-Nov-2013 08:00:00   02-Nov-2013 02:00:00   02-Nov-2013 20:00:00
Columns 4 through 6
03-Nov-2013 14:00:00   04-Nov-2013 08:00:00   05-Nov-2013 02:00:00
通过指定时区为纽约时间,t1所对应时间正好在夏令时之前。
>> t1.TimeZone = 'America/New_York';
>> t2.TimeZone = 'America/New_York';
如果用户这时使用1个日历天为步长,那么这两个时间点之间每天的时间长度并不都是24小时:
>> t = t1:t2;
>> dt = diff(t)
dt =
24:00:00   25:00:00   24:00:00   24:00:00
如果将步长设置为固定长度的1天:
>> t = t1:days(1):t2
t =
Columns 1 through 3
01-Nov-2013 08:00:00   02-Nov-2013 08:00:00   03-Nov-2013 07:00:00
Columns 4 through 5
04-Nov-2013 07:00:00   05-Nov-2013 07:00:00
这时我们可以验证各时间点之间的长度是否都等于24小时:
>> dt = diff(t)
dt =
24:00:00   24:00:00   24:00:00   24:00:00
【例3-44】  日期和时间序列的计算。
日期和时间序列可以像数组那样进行加减。
首先我们创建一个日期时间点:
>> t1 = datetime('01-Nov-2013 08:00:00');
然后讲一个固定长度小时数组加到这一个时间点上:
>> t = t1 + hours(0:2)
t =
01-Nov-2013 08:00:00   01-Nov-2013 09:00:00   01-Nov-2013 10:00:00
我们还可以加上一个日历月份时间长度:
>> t = t1 + calmonths(1:5)
t =
Columns 1 through 3
01-Dec-2013 08:00:00   01-Jan-2014 08:00:00   01-Feb-2014 08:00:00
Columns 4 through 5
01-Mar-2014 08:00:00   01-Apr-2014 08:00:00
上面结果中的每一个时间点都是当月的第一天。如果我们要计算数组时间点之间的相隔天数,我们可以使用以下命令:
>> dt = caldiff(t,'days')
dt =
31d   31d   28d   31d
如果要产生一个每月最后一天的日期序列,可以通过如下方法:
>> t = datetime('31-Jan-2014') + calmonths(0:11)
t =
Columns 1 through 5
31-Jan-2014   28-Feb-2014   31-Mar-2014   30-Apr-2014   31-May-2014
Columns 6 through 10
30-Jun-2014   31-Jul-2014   31-Aug-2014   30-Sep-2014   31-Oct-2014
Columns 11 through 12
30-Nov-2014   31-Dec-2014
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java时间操作类库—Joda-Time
M语言中的操作符说明:数字以及时间相关的操作符
取而代之!以后不用再 new Date() 了
一学就会的 Python 时间转化总结(超全)
mysql 存储数据类型
轻松让你的XP显示农历
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服