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

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

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

  FILETIME结构是一个64位值,代表
  自1601年1月1日以来已经过了100纳秒的间隔,
  协调世界时(UTC)。 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值为负,以防万一我们应该引发异常。

Web应用程序上的恶意用户是否可以操纵Web应用程序前端发送的输入(在表单数据旁边)? - java

Web应用程序上的恶意用户是否可以通过任何可能的方式来操纵Web应用程序前端发送的输入(当然,这不是在谈论FORM DATA),但是发送的请求例如当我允许他编辑他的个人资料或他的内容时,他可能会操纵ID(userId或contentId),从而可能恶意地对其他用户的内容进行邪恶?这些输入固定在网页上并且不可编辑,但用户仍然可以操纵它们吗?用户是否可能以这种方…

什么时候在Hibernate中调用flush()和commit()? - java

我有以下情况: openSession() tx = session.beginTransaction(); try { ... session.saveOrUpdate(obj_1); ... session.saveOrUpdate(obj_2); ... session.saveOrUpdate(obj_3); session.flush(); tx.…

如果没有它,为什么还要使用collect(Collectors.toList())? - java

我在许多Java 8参考资料和示例中都看到了以下代码:List <Integer> l = Arrays.asList(7, 3, 9, 8, 6, 5, -1, -100); l.stream().filter(y -> y <l.get(0)).collect(Collectors.toList()). forEach(Syste…

反转GregorianCalendar对象添加分钟方法 - java

当向GregorianCalender对象添加一分钟时,我们像下面这样进行操作,这将使时间增加一分钟:GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("UTC")); gc.add(Calendar.MINUTE,1); 但是由于错误,我将其反转为:Gre…

获取Java中的BIOS时间 - java

Java中有没有办法获取BIOS日期和时间?调用java.util.Calendar.getInstance()或new java.util.Date()?时Java是否使用BIOS(基本输入/输出系统)日期时间我确实知道Java以格林尼治标准时间1970年1月1日00:00:00为基础以某种方式工作当前的日期和时间。但是到底如何呢? 参考方案 它询问操作系…