標籤:

MATLAB+seconds(1)

本文內容所有內容僅代表本人觀點,和Mathworks無關

老闆:新年快樂啊myc

myc:老闆新年快樂

老闆:新年裡我給你講個故事:工作中我們不時會需要對程序的日誌進行處理,在處理過程中一個重要的環節就是記錄時間,你知道MATLAB裡面怎麼處理時間最方便嗎?

myc:(這是故事嗎……)老闆您說

老闆:MATLAB內置了很多方便的函數喲,讓我一一道來:

假如我們的程序日誌中有這樣一行數據

*** Entering :: 04-Jan-2017 11:31:07 ***n

通常我們需要提取出日誌中的時間內容,MATLAB的正則表達regexp提供了很方便的日期的搜索:

>>log = *** Entering :: 04-Jan-2017 11:31:07 ***;n>>date = regexp(log,(?<day>d+)-(?<month>w+)-(?<year>d+),names)ndate = nn struct with fields:nn day: 04n month: Jann year: 2017n

可以看到我們不需要記住複雜的日期正則規則,只要簡單的使用?<day>, ?<month>,和?<year>就可以了,而緊接著的d+ 表示1或多個數字, w+表示1或多個字母。

整句翻譯過來就是

(?<day>d+)-(?<month>w+)-(?<year>d+)n數字組成的日期-字母組成的月份-數字組成的年份n04 - Jan - 2017n

如果別人不小心把日誌的日期改成了如下格式

*** Entering :: 04-01-2017 11:31:07 ***n

我們不用再重新GOOGLE新格式的正則如何寫,而是只要將?<month>w+改成由數字組成的月份即可

>>date = regexp(log,(?<day>d+)-(?<month>d+)-(?<year>d+),names)ndate = nn struct with fields:nn day: 04n month: 01n year: 2017n

myc:哇好方便,老闆真厲害,貌似月份那裡可以用(?<month>(d+|w+))來代替?

老闆:……我們再講下一個故事:在R2014b的時候,MATLAB新增了一種數據類型datetime,可以很方便的進行時間類型之間的運算

假設我們現在的時間是

2017/01/04 11:31n

那我們只需要將時間轉換成datetime類型

>>dateString = 2017/01/04 11:31;n>>currentDate = datetime(dateString,InputFormat,yyyy/MM/dd HH:mm)ncurrentDate = nn datetimenn 04-Jan-2017 11:31:00n

myc:道理我都懂……轉換了有什麼用呢?

老闆:別急,你還記得你上次寫文章是什麼時候嗎?

myc:……不是很記得了……

老闆:我們來從以前設置的跟蹤系統中導出文章數目,找到上次更新文章的時間

2016-10-09 16:06:06 UTCn

再用datetime來轉化,因為導出的數據是有時區的,我們加個『TimeZone』

>>lastUpdateString = 2016-10-09 16:06:06 UTCnn>>lastUpdated = datetime(lastUpdateString,InputFormat,yyyy-MM-dd HH:mm:ss Z,TimeZone,UTC)nnlastUpdated =nn datetimenn 09-Oct-2016 16:06:06n

現在如果進行操作的話MATLAB會告訴我們的當前時間變數沒有設置時區,不能和其它已經設置了時區的datetime變數進行操作

>>currentDate - lastUpdatednCannot combine or compare a datetime array with a time zone with onenwithout a time zone.n

我們可以簡單的將時區設為local

>>currentDate.TimeZone = localncurrentDate = nn datetimenn 04-Jan-2017 11:31:00n

這裡打岔一下,datetime的數據類型提供了很多方便的運算。因為我們賦予了currentDate這個變數一個時區,它就和local時區綁定了,當我們賦予它一個新的時區(比如UTC),它的時間也會隨之變化到新的時區,非常方便

>>currentDate.TimeZone = UTCncurrentDate= nn datetimenn 04-Jan-2017 16:31:00n

下面我們來看看現在和上一次更新文章隔了多久。兩個datetime變數之間可以很方便的進行數值操作.

>>slackingOffTime = currentDate- lastUpdatednnslackingOffTime = nn durationnn 2088:24:54n

得到的答案是個duration類型的變數,同樣也是R2014b加入的類型。duration類型可以和days, seconds, minutes等很多時間相關的數據類型進行轉換和運算:

>>days(slackingOffTime)nans =nn 87.0173n

老闆:看來你已經87天多沒有寫文章了

myc:……我在休假

老闆:還不快工作去!

MATLAB也記得新年多出來的1秒哦

>>Dec = datetime(2016-12-31T23:59:59.000Z,TimeZone,UTCLeapSeconds)n>>Jan = datetime(2017-1-1T00:00:00.000Z,TimeZone,UTCLeapSeconds)nn>>Jan - Decnnans = nn durationnn 00:00:02n

推薦閱讀:

MATLAB 高級數據結構連載 3:金融時間序列Financial Time Series (Part C) 跟蹤股票賬戶權益的變動
The Trinity: MATLAB Mobile, MATLAB Online, and MATLAB Drive
MATLAB神經網路(一):BP神經網路

TAG:MATLAB | 时间 |