7 ?日期和時間
MATLAB在2014b版本中將日期和時間獨立成了一個數(shù)據(jù)類型传透,新的版本中對于時間數(shù)據(jù)的處理功能更為強大怔檩。比如datetime和duration等函數(shù)趴生,可以支持對時間的高效計算前酿、對比、格式化顯示拾因。對這類數(shù)組的操作方法和對普通數(shù)組的操作是基本一致的。下面我們就對主要的功能進行介紹旷余。
7.1 ?創(chuàng)建日期和時間數(shù)組
存儲日期和時間信息的最主要形式就是datatime數(shù)組绢记,它支持代數(shù)運算、排序正卧、比較蠢熄、繪圖和格式化顯示。代數(shù)運算的結(jié)果通過duration數(shù)組返回炉旷,如果采用基于日歷的函數(shù)進行的計算签孔,那么返回的結(jié)果將是calendarDuration數(shù)組蝉揍。Matlab提供了以下函數(shù)來進行日期及時間類型的計算绪抛,請見表3-11?。
表3-11?日期和時間函數(shù)
函 ???數(shù)說 ???明函 ???數(shù)說 ???明
datetime基于當前日期創(chuàng)建時間數(shù)組雅潭,或者將日期字符串或數(shù)據(jù)轉(zhuǎn)換為時間數(shù)組yyyymmdd將MATLAB datetime數(shù)據(jù)類型轉(zhuǎn)化為YYYYMMDD數(shù)值格式
years年數(shù)長度minutes分鐘數(shù)長度
days天數(shù)長度seconds秒數(shù)長度
hours小時數(shù)長度duration由數(shù)值創(chuàng)建duration數(shù)組
calyears日歷年數(shù)長度calweeks日歷星期數(shù)長度
calquarters日歷季度數(shù)長度caldays日歷天數(shù)長度
calmonths日歷月數(shù)長度calendarDuration由數(shù)值創(chuàng)建日歷時間長度數(shù)組
下面我們舉例來說明如何創(chuàng)建日期和時間數(shù)組罐盔。
【例3-41】??日期時間數(shù)組創(chuàng)建但绕。
例如,如果我們想要來表示這樣兩個日期:June 28, 2014 at 6 a.m和June 28, 2014 at 7 a.m翘骂,那么我們可以將這些數(shù)值相應(yīng)的賦值給datetime函數(shù)各元素即可:
>> t = datetime(2014,6,28,6:7,0,0)
t =
???28-Jun-2014 06:00:00 ??28-Jun-2014 07:00:00
如果想要對數(shù)組中的某一元素進行修改壁熄,那么只需要將新的數(shù)值賦值給相應(yīng)的元素即可:
>> t.Day = 27:28
t =
???27-Jun-2014 06:00:00 ??28-Jun-2014 07:00:00
如果想要更改數(shù)組的顯示格式,只需要改變Format屬性即可碳竟。這一過程中改變的只是數(shù)據(jù)顯示格式草丧,數(shù)據(jù)本身沒有任何改動。
>> t.Format = 'MMM dd, yyyy'
t =
???Jun 27, 2014 ??Jun 28, 2014
如果你要將一個datetime數(shù)組減去另一個datetime數(shù)組莹桅,那么結(jié)果就是duration數(shù)組:
>> 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數(shù)組顯示格式是“hours:minutes:seconds”烛亦。通過設(shè)置Format屬性,用戶可以改變顯示格式懂拾。例如可以改變?yōu)閱我粏挝弧靶r”煤禽,具體操作如下:
>> d.Format = 'h'
d =
???48.512 hrs ??23.512 hrs
用戶通過使用seconds、minutes岖赋、hours檬果、days或?years函數(shù),也可以直接創(chuàng)建一個新的單一單位的duration數(shù)值唐断。例如选脊,創(chuàng)建一個2天的天數(shù)長度,也就是正好等于24小時×2:
>> d = days(2)
d =
???2 days
用戶通過使用caldays脸甘、calweeks恳啥、calquarters和calyears函數(shù),也可以直接創(chuàng)建一個新的單一單位的calendar duration數(shù)值丹诀。例如钝的,創(chuàng)建一個2個月的日歷天數(shù)長度:
>> L = calmonths(2)
L =
???2mo
如果將一個calendar months?和一個calendar days數(shù)值相加,那么天數(shù)數(shù)值還將會分開顯示铆遭,因為每個月的天數(shù)并不一致硝桩。除非是將其和一個具體的日期時間相加。
>> L = calmonths(2) + caldays(35)
L =
???2mo 35d
將一個calendar durations和一個datetime數(shù)組相加:
>> t2 = t + calmonths(2) + caldays(35)
t2 =
???Oct 01, 2014 ??Oct 02, 2014
此時得到的t2依然是一個datetime數(shù)組疚脐。
>> whos t2
??Name ?????Size ???????????Bytes ?Class ??????Attributes
??t2 ???????1x2 ??????????????161 ?datetime? ? ??
總的來說亿柑,有多種方式來表達日期和時間,MATLAB對于每一種都提供了方法(如圖3-7所示):
(1)表達時間點棍弄,使用datetime數(shù)據(jù)格式望薄。例如Wednesday, June 18, 2014 10:00:00。
(2)表達一段時間的長度呼畸,采用固定時間長度單位痕支,使用duration數(shù)據(jù)類型。在使用此種類型的時候蛮原,1天總是等于24小時的卧须,一年總是等于365.2425天的。例如:72 小時10分鐘儒陨。
(3)表達一段時間的長度花嘶,采用可變時間長度單位,使用calendarDuration數(shù)據(jù)類型蹦漠。例如1個月可以是28椭员、29、30或者31天笛园。另外calendarDuration還考慮了夏令時和閏年隘击,所以1天時間可以大于或者小于24小時侍芝,1年可以是365天或者366天。
圖3-7選擇需要導入的圖像文件
【例3-42】??指定時區(qū)與相關(guān)計算埋同。
在對日期和時間的計算中州叠,MATLAB還提供了時區(qū)設(shè)置選項。這樣我們只需在創(chuàng)建日期時間數(shù)組的時候指定好了時區(qū)凶赁,那么就可以在不同時區(qū)之間進行相關(guān)計算了咧栗,而不必人工換算中間有多少時差。下面我們就舉例來說明如何來使用虱肄。
首先創(chuàng)建指定了時區(qū)的datetime數(shù)組:
>> 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
在這里我們指定的是系統(tǒng)內(nèi)部的時區(qū)設(shè)置'local'楼熄,返回的結(jié)果中“+0800”一項就是我們所處的時區(qū)和Coordinated Universal Time之間的時差。
用戶也可以指定時區(qū):
>> 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】??日期和時間序列的產(chǎn)生。
本例將來為讀者演示如何通過使用冒號(:)來產(chǎn)生日期和時間序列错敢。
采用默認步長來產(chǎn)生序列翰灾,默認步長為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函數(shù)來指定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
通過指定時區(qū)為紐約時間稚茅,t1所對應(yīng)時間正好在夏令時之前纸淮。
>> 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
如果將步長設(shè)置為固定長度的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】??日期和時間序列的計算亚享。
日期和時間序列可以像數(shù)組那樣進行加減咽块。
首先我們創(chuàng)建一個日期時間點:
>> t1 = datetime('01-Nov-2013 08:00:00');
然后講一個固定長度小時數(shù)組加到這一個時間點上:
>> 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
上面結(jié)果中的每一個時間點都是當月的第一天。如果我們要計算數(shù)組時間點之間的相隔天數(shù)欺税,我們可以使用以下命令:
>> dt = caldiff(t,'days')
dt =
???31d ??31d ??28d ??31d
如果要產(chǎn)生一個每月最后一天的日期序列侈沪,可以通過如下方法:
>> 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