【问题标题】:How to convert Java Date object to Matlab datetime array with time zone如何将 Java 日期对象转换为带有时区的 Matlab 日期时间数组
【发布时间】:2020-05-22 22:45:45
【问题描述】:

我使用的程序返回时间戳在Java date objects 中的数据。我需要在 Matlab 中读取时间,并能够使用在 Matlab 中生成的可能指定时区的日期时间数组进行日期时间算术。如何将 Java 日期对象转换为带有时区的 Matlab 日期时间数组?

我一直在尝试使用Java time serial。但我无法在 Matlab 中正确获取时区。

例如,现在是美国东部标准时间下午 2:30,Matlab 中的 now 函数按预期工作。

>> datetime(now,'ConvertFrom','datenum','TimeZone','America/New_York')
ans = 
  datetime
   06-Feb-2020 14:37:40

但是,从 Java 时间序列开始,即自 1970/1/1 GMT 以来的时间(以毫秒为单位),同一行不起作用。东部标准时间上午 10:40 的日期对象返回以下内容。

>> class(JavaDateObj)
ans =
    'java.util.Date'    
>> format long
>> JavaDateObj.getTime
ans =
     1.581003592273000e+12
% to run this snippet, ignore the above; set JavaDateSerial = 1.581003592273000e+12; and replace JavaDateObj.getTime below with JavaDateSerial


%%%% expecting time in EST below and get time in GMT instead

>> datetime(datenum([1970 1 1 0 0 JavaDateObj.getTime/1000]),'ConvertFrom','datenum','TimeZone','America/New_York')
ans = 
  datetime
   06-Feb-2020 15:39:52

%%%% expecting now to be later than earlier but get the wrong result

>> temp=ans;
>> datetime(now,'ConvertFrom','datenum','TimeZone','America/New_York') > temp
ans =
  logical
   0

如果使用日期序列是使上述转换工作的方法,你如何将 Java 时间序列中的时区合并到 Matlab 中?

如果有其他方法可以将Java日期对象转换为带时区的Matlab日期时间数组,请指教。

【问题讨论】:

    标签: java matlab datetime


    【解决方案1】:

    java.util.Datereturns the milliseconds in GMTgetTime 方法,但 datenum 构造函数在本地时间需要毫秒。您需要先转换为 GMT 时间,然后再转换时区作为第二步。

    dt = datetime(datenum([1970 1 1 0 0 JavaDateObj.getTime/1000]),'ConvertFrom','datenum');
    dt.TimeZone = 'GMT';
    dt.TimeZone = 'America/New_York';
    

    如果您在原始构造函数调用中指定 TimeZone,您就是在告诉 Matlab 您发送的 datenum 值是已经在该时区中的本地时间。

    您还可以使用“posixtime”转换格式来简化您的构造函数调用,这更接近java.util.Date.getTime() 返回的内容。

    dt = datetime(datenum(javaDateObj.getTime/1000),'ConvertFrom','posixtime')
    

    【讨论】:

    • 哦,是的:尝试使用 'posixtime' 日期格式而不是 'datenum' 以获得更简单的构造函数调用。
    【解决方案2】:

    最好不要涉及 datenum。在 MATLAB 自 R2018b 以来,有一个直接转换:

    >> format long g
    >> t = 1.581003592273000e+12
    t =
             1581003592273
    >> dt = datetime(t,'convertFrom','epochtime','TicksPerSecond',1000,'TimeZone','UTC','Format','dd-MMM-uuuu HH:mm:ss.SSS z')
    dt = 
      datetime
       06-Feb-2020 15:39:52.273 UTC
    >> dt.TimeZone = 'America/New_York'
    dt = 
      datetime
       06-Feb-2020 10:39:52.273 EST
    

    t 是自 1970 UTC 以来的毫秒,因此要获取本地时间戳,您需要创建一个 UTC 日期时间,然后更改时区。

    在 R2018b 之前,您可以这样做:

    >> dt = datetime(t/1000,'convertFrom','posixtime','TimeZone','UTC','Format','dd-MMM-uuuu HH:mm:ss.SSS z')
    dt = 
      datetime
       06-Feb-2020 15:39:52.273 UTC
    >> dt.TimeZone = 'America/New_York'
    dt = 
      datetime
       06-Feb-2020 10:39:52.273 EST
    

    【讨论】:

    • Nvm。没有意识到格式部分只是为了显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2015-08-18
    • 2023-04-09
    相关资源
    最近更新 更多