如何使用Matlab将datetime转换为以纳秒为单位表示Unix时间戳的字符串?

如何使用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',

我试图使用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','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