MATLAB+seconds(1)
本文內容所有內容僅代表本人觀點,和Mathworks無關
老闆:新年快樂啊myc
myc:老闆新年快樂
老闆:新年裡我給你講個故事:工作中我們不時會需要對程序的日誌進行處理,在處理過程中一個重要的環節就是記錄時間,你知道MATLAB裡面怎麼處理時間最方便嗎?myc:(這是故事嗎……)老闆您說老闆:MATLAB內置了很多方便的函數喲,讓我一一道來:
假如我們的程序日誌中有這樣一行數據
*** Entering :: 04-Jan-2017 11:31:07 ***n
>>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神經網路