Main Content

将日期时间转换为儒略日期或 POSIX 时间

您可以转换 datetime 数组,以采用专门的数值格式来表示时间点。通常,这些格式会将时间点表示为自指定的起点以来经过的秒数或天数。例如,儒略日期是指自儒略周期开始以来经过的整天和小数天数。POSIX® 时间是指自 UTC(协调世界时)1970 年 1 月 1 日 00:00:00 以来经过的秒数。MATLAB® 提供 juliandateposixtime 函数来将 datetime 数组转换为儒略日期和 POSIX 时间。

虽然 datetime 数组不必带有时区,但将“未设置时区的”datetime 值转换为儒略日期或 POSIX 时间可能会导致意外的结果。要确保获得预期的结果,请在转换之前指定时区。

在转换之前指定时区

您可以为 datetime 数组指定时区,但不一定需要执行该操作。实际上,datetime 函数默认情况下会创建一个“未设置时区的”datetime 数组。

为当前日期时间创建 datetime 值。

d = datetime("now")
d = datetime
   25-Jan-2024 22:08:16

d 是根据您的计算机上的本地时间构建的,没有与其关联的时区。在许多情况下,您可能会认为可将未设置时区的 datetime 数组中的时间视为本地时间。但是,juliandateposixtime 函数将未设置时区的 datetime 数组中的时间视为 UTC 时间,而非本地时间。为避免出现任何混乱,建议您避免对未设置时区的 datetime 数组使用 juliandateposixtime。例如,避免在代码中使用 posixtime(datetime("now"))

如果 datetime 数组包含不表示 UTC 时间的值,请使用 TimeZone 名称-值对组参量来指定时区,以使 juliandateposixtime 正确解释 datetime 值。

d = datetime("now","TimeZone","America/New_York")
d = datetime
   25-Jan-2024 22:08:16

作为备选方法,您可以在创建该数组后指定 TimeZone 属性。

d.TimeZone = "America/Los_Angeles"
d = datetime
   25-Jan-2024 19:08:16

要查看时区的完整列表,请使用 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

比较 JDZJD。其差等于 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

比较 PTZPT。其差等于 UTC 和 America/New_York 时区之间的时区偏移量(以秒计)。

PTZ - PT
ans = 1×3

       14400       14400       14400

另请参阅

| | |

相关主题