您可以转换 datetime 数组,以采用专门的数值格式来表示时间点。通常,这些格式会将时间点表示为自指定的起点以来经过的秒数或天数。例如,儒略日期是指自儒略周期开始以来经过的整天和小数天数。POSIX 时间是指自 UTC(协调世界时)1970 年 1 月 1 日 00:00:00 以来经过的秒数。MATLAB 提供 juliandate 和 posixtime 函数来将 datetime 数组转换为儒略日期和 POSIX 时间。
虽然 datetime 数组不必带有时区,但将“未设置时区的”datetime 值转换为儒略日期或 POSIX 时间可能会导致意外的结果。要确保获得预期的结果,请在转换之前指定时区。
在转换之前指定时区
您可以为 datetime 数组指定时区,但不一定需要执行该操作。实际上,datetime 函数默认情况下会创建一个“未设置时区的”datetime 数组。
为当前日期和时间创建 datetime 值。
d = datetime('now')
d = datetime
03-Aug-2020 20:28:39
d 是根据您的计算机上的本地时间构建的,没有与其关联的时区。在许多情况下,您可能会认为可将未设置时区的 datetime 数组中的时间视为本地时间。但是,juliandate 和 posixtime 函数将未设置时区的 datetime 数组中的时间视为 UTC 时间,而非本地时间。为避免出现任何混乱,建议您避免对未设置时区的 datetime 数组使用 juliandate 和 posixtime。例如,避免在代码中使用 posixtime(datetime(‘now’))。
如果 datetime 数组包含不表示 UTC 时间的值,请使用 TimeZone 名称-值对组参数来指定时区,以使 juliandate 和 posixtime 正确解释 datetime 值。
d = datetime('now','TimeZone','America/New_York')
d = datetime
03-Aug-2020 20:28:39
作为备选方法,您可以在创建该数组后指定 TimeZone 属性。
d.TimeZone = 'America/Los_Angeles'
d = datetime
03-Aug-2020 17:28:39
要查看时区的完整列表,请使用 timezones 函数。
将已设置时区和未设置时区的日期时间值转换为儒略日期
儒略日期是指前公历日历中自公元前 4714 年 11 月 24 日或前儒略日历中自公元前 4713 年 1 月 1 日中午起的天数(包括小数天数)。要将 datetime 数组转换为儒略日期,请使用 juliandate 函数。
创建一个 datetime 数组并指定其时区。
DZ = datetime('2016-07-29 10:05:24') + calmonths(1:3);
DZ.TimeZone = 'America/New_York'
DZ = 1x3 datetime
29-Aug-2016 10:05:24 29-Sep-2016 10:05:24 29-Oct-2016 10:05:24
将 D 转换为等同的儒略日期。
format longG
JDZ = juliandate(DZ)
JDZ = 1×3
2457630.08708333 2457661.08708333 2457691.08708333
为 DZ 创建未设置时区的副本。将 D 转换为等同的儒略日期。由于 D 没有时区,因此 juliandate 将时间视为 UTC 时间。
D = DZ;
D.TimeZone = '';
JD = juliandate(D)
JD = 1×3
2457629.92041667 2457660.92041667 2457690.92041667
比较 JDZ 和 JD。其差等于 UTC 和 America/New_York 时区之间的时区偏移量(以小数天数计)。
JDZ - JD
ans = 1×3
0.166666666511446 0.166666666511446 0.166666666511446
将已设置时区和未设置时区的日期时间值转换为 POSIX 时间
POSIX 时间是指自 UTC(协调世界时)1970 年 1 月 1 日 00:00:00 以来经过的秒数(包括小数秒),忽略闰秒。要将 datetime 数组转换为 POSIX 时间,请使用 posixtime 函数。
创建一个 datetime 数组并指定其时区。
DZ = datetime('2016-07-29 10:05:24') + calmonths(1:3);
DZ.TimeZone = 'America/New_York'
DZ = 1x3 datetime
29-Aug-2016 10:05:24 29-Sep-2016 10:05:24 29-Oct-2016 10:05:24
将 D 转换为等同的 POSIX 时间。
PTZ = posixtime(DZ)
PTZ = 1×3
1472479524 1475157924 1477749924
为 DZ 创建未设置时区的副本。将 D 转换为等同的 POSIX 时间。由于 D 没有时区,因此 posixtime 将时间视为 UTC 时间。
D = DZ;
D.TimeZone = '';
PT = posixtime(D)
PT = 1×3
1472465124 1475143524 1477735524
比较 PTZ 和 PT。其差等于 UTC 和 America/New_York 时区之间的时区偏移量(以秒计)。
PTZ - PT
ans = 1×3
14400 14400 14400