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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容