当前位置: 首页 > 面试题库 >

您如何用Java 8 Instant表示MS-DTYP`DATETIME`?

庾才
2023-03-14
问题内容

在Microsoft Spec中,DATETIME表示为2个32位整数:lowhigh

参考:https : //docs.microsoft.com/zh-
cn/openspecs/windows_protocols/ms-
dtyp/cca27429-5689-4a16-b2b4-9325d93e4ba2

FILETIME结构是一个64位值,表示自1601年1月1日(协调世界时)以来已过去的100纳秒间隔数。typedef struct _FILETIME
{DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME, PFILETIME,
LPFILETIME;
dwLowDateTime:32位无符号整数,包含文件时间的低位。dwHighDateTime:32位无符号整数,包含文件时间的高位。

例如,这是长 130280867040000000

所以高和低的计算

int high = (int)(fullval >> 32);
int low = (int)fullval;

那么高= 30333378 和低=552794112

如何将这些计算到Java 8 Instant?


问题答案:

对于1秒精度的转换,您自己的答案就可以了。如果您还需要转换秒的分数,这是一种方法。

    Instant msFiletimeEpoch = Instant.parse("1601-01-01T00:00:00Z");
    // a tick is 100 nanoseconds
    int nanosPerTick = 100;
    long ticksPerSecond = TimeUnit.SECONDS.toNanos(1) / nanosPerTick;

    long fullval = 130_280_867_040_000_000L;

    long seconds = fullval / ticksPerSecond;
    long nanos = fullval % ticksPerSecond * nanosPerTick;

    Instant answer = msFiletimeEpoch.plusSeconds(seconds).plusNanos(nanos);

    System.out.println(answer);

输出为:

2013-11-05T00:58:24Z

让我们尝试在原始价值上再加上1个勾号;它应该增加100纳秒。

    long fullval = 130_280_867_040_000_001L;

2013-11-05T00:58:24.000000100Z

确实如此。

请注意未来很长的日期:根据您的报价,Microsoft整数都是无符号的。Java
long已签名。因此,在30828年的某个时候,我们将开始获得非常错误的结果。万一如果long值是负数,我们应该抛出一个异常



 类似资料:
  • 问题内容: 我从https://github.com/jaliss/securesocial/tree/master下载了securesocial- master.zip 1,解压后更改目录 2.运行激活器 错误消息: 问题答案: 根据您输入的信息: 光盘到 C:\ Users \ ddd \ play \ securesocial-master 2.从根目录运行激活器 C:\ Users \ d

  • 问题内容: 等待,不要着急回答“ java.util.Date”,请考虑以下情形。 具有2个字段的Person对象:“ birthday”和“ nextMeeting”均为java.util.Date。现在将生日作为日期类型列(无时间)存储在数据库中,例如。1979年1月10日,以及nextMeeting作为ex的日期时间类型。2010年1月10日20:00:00。 从数据库中拉出它,JDBC将自

  • 问题内容: 我想验证数据库中是否存在表,如果不存在,则要创建它。如何获取当前数据库中所有表的列表? 我可以使用SELECT来获得数据库列表,如下所示: 剩下的就是创建表(如果不存在)。 我还尝试使用以下数据库同时创建表: 但这在“使用”行上给了我错误,说“ db”不存在。这次,我将尝试使用2个不同的命令来执行此操作。 问题答案: 这应该为您提供数据库中所有表的列表 因此,您可以像使用数据库检查一样

  • 问题内容: 我试图使用开放源代码的Java库来可视化图中的节点和边,但是我完全迷失了。 我的文件夹中有一堆jar文件。单击某些jar文件会使Java swing窗口弹出并显示图形。单击其他jar文件不会执行任何操作。 如果我知道了,我是否会将jar文件与其他文件保存在那里,还是不能使用? 如果我弄清楚了如何使用这些文件,这是否意味着如果我将Java项目转移到另一台计算机上,就必须包括它们?我将如何

  • 本文向大家介绍您如何在Cucumber中使用正则表达式?,包括了您如何在Cucumber中使用正则表达式?的使用技巧和注意事项,需要的朋友参考一下 我们可以在Cucumber中使用正则表达式来选择功能文件中相似语句的集合。 示例 功能文件 步骤定义文件具有@Given(“([^ \”] *)season $“)中的@Given时间表,该表在正则表达式的帮助下将两个Given语句映射到Feature

  • 如何使用Angular或JavaScript在超文本标记语言页面中显示Microsoft Word文件。请推荐任何提供此功能的库。