我使用的程序返回时间戳位于 Java date objects 的数据。我需要读取 Matlab 中的时间,并能够使用 Matlab 中生成的可能指定时区的日期时间数组进行日期时间算术。如何将 Java Date 对象转换为带时区的 Matlab 日期时间数组?
我一直在尝试使用Java time serial 。但我无法在 Matlab 中获得正确的时区。
例如,现在是美国东部时间下午 2:30 左右,now
Matlab 中的函数按预期工作。
>> 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.util.Date 的 getTime 方法 returns the milliseconds in GMT ,但 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')
关于java - 如何将 Java Date 对象转换为带时区的 Matlab 日期时间数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102576/