如何使用Matlab将datetime转换为以纳秒为单位表示Unix时间戳的字符串?
我试图使用Matlab从输入日期字符串生成一个字符串,该字符串包含以纳秒为单位的Unix时间戳(即自1970年1月1日00:00:00起的纳秒) 例如,如果我的输入在纪元开始后仅为1ns,则以下代码有效:如何使用Matlab将datetime转换为以纳秒为单位表示Unix时间戳的字符串?,matlab,datetime,timestamp,Matlab,Datetime,Timestamp,我试图使用Matlab从输入日期字符串生成一个字符串,该字符串包含以纳秒为单位的Unix时间戳(即自1970年1月1日00:00:00起的纳秒) 例如,如果我的输入在纪元开始后仅为1ns,则以下代码有效: t0 = datetime('01-Jan-1970 00:00:00.000000000','Format','dd-MMM-yyyy HH:mm:ss.SSSSSSSSS'); t1 = datetime('01-Jan-1970 00:00:00.000000001','Format',
t0 = datetime('01-Jan-1970 00:00:00.000000000','Format','dd-MMM-yyyy HH:mm:ss.SSSSSSSSS');
t1 = datetime('01-Jan-1970 00:00:00.000000001','Format','dd-MMM-yyyy HH:mm:ss.SSSSSSSSS');
dt_ns = seconds(t1 - t0)*1e9
dt_ns_string = sprintf('%.0f',dt_ns)
dt_ns_string =
'1'
我有我需要的纳秒精度
但是,如果我改为t1
使用今天左右的日期:
t1 = datetime('16-Jun-2020 00:00:00.000000001','Format','dd-MMM-yyyy HH:mm:ss.SSSSSSSSS');
然后输出如下所示:
dt_ns_string =
'1592265600000000000'
我失去了字符串末尾的最后纳秒精度(最后一个字符应该是“1”)
我怎样才能解决这个问题
编辑 正如评论中所建议的,还有Matlab函数
posixtime()
,它不需要手动减去1970年1月1日对应的日期时间。但是,这会导致同样的问题:
dt_ns_posix = posixtime(t1)*1e9
sprintf('%.0f',dt_ns_posix)
'1592265600000000000'
这里有一种方法可以避免双精度
double
固有的精度损失:
日历持续时间
标量,指示天、小时、分钟和秒char
并提取天数、小时数、分钟数和秒数1e9
,并转换为uint64
。请注意,每个单独的值乘以1e9
得到的整数完全在浮点精度的限制范围内(即不大于2^53
)'native'
选项结合使用,以获得作为uint64
值的纳秒总数李>
你在找吗?即使使用posxtime,我也无法在最后给出最后的纳秒字符。虽然如果你能用posxtime提供一个基本的例子,我还是很想看看!编辑这个问题以显示它给出了相同的结果。我想亲自检查一下,但我运行MATLAB的机器目前正在维修中(我知道这是个蹩脚的借口)。。。文档中没有太多关于精度的内容,也许只是微秒?或者这仅仅是一个显示问题?我认为这与posixtime()可能返回一个double有关,但是由于我需要19个字符来表示我的字符串,我认为double是不够的。我正在Matlab中查看uint64数据类型,但无法解决此问题。
t0 = datetime('01-Jan-1970 00:00:00.000000000','Format','dd-MMM-yyyy HH:mm:ss.SSSSSSSSS');
t1 = datetime('16-Jun-2020 00:00:00.000000001','Format','dd-MMM-yyyy HH:mm:ss.SSSSSSSSS');
b = between(t0, t1, {'Days', 'Time'});
t = str2double(regexp(char(b), '(?<=(^| )).+?(?=[dhms$])', 'match')); % split d, h, m, s
if numel(t)==3 % if the number of days is 0 it will not be present
t = [0 t];
end
result = sum(uint64(t*1e9).*uint64([86400 3600 60 1]), 'native'); % sum as uint64
result =
uint64
1592265600000000001