首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Java 8即时表示MS-DTYP ` `DATETIME`‘?

如何用Java 8即时表示MS-DTYP ` `DATETIME`‘?
EN

Stack Overflow用户
提问于 2019-12-11 17:37:53
回答 2查看 126关注 0票数 2

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

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

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

例如,下面是长130280867040000000

所以,高和低计算

代码语言:javascript
复制
int high = (int)(fullval >> 32);
int low = (int)fullval;

所以高= 30333378和低= 552794112

如何将这些计算成Java 8即时程序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-12 03:39:48

对于1秒精度的转换,您自己的答案是很好的。如果你也需要转换秒的分数,这里有一个方法。

代码语言:javascript
复制
    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

让我们试着在你的口角值上再加一个勾号;它应该会增加100纳秒。

代码语言:javascript
复制
    long fullval = 130_280_867_040_000_001L;

2013-11-05T00:58:24.000000100Z

所以它是这样的。

关于非常远的未来日期的警告:根据您的引用,Microsoft整数都是无符号的。一个Java long被签名。因此,在30828年度的某个时候,我们将开始得到非常错误的结果。以防万一,如果long值为负值,我们应该抛出异常。

票数 1
EN

Stack Overflow用户

发布于 2019-12-11 17:50:43

啊,当我把字节一分为二的时候,我是在错误的树上吠叫。

基本上,它只是说单位在100纳秒内。

而时代也有不同的基本时间。所以你也得加上偏移量。

这就是:

代码语言:javascript
复制
    private static final long DATETIME_EPOCH_DIFF_1601;
    static {
        LocalDateTime time32Epoch1601 = LocalDateTime.of(1601, Month.JANUARY, 1, 0, 0);
        Instant instant = time32Epoch1601.atZone(ZoneOffset.UTC).toInstant();
        DATETIME_EPOCH_DIFF_1601 = (instant.toEpochMilli() - Instant.EPOCH.toEpochMilli()) / 1000;
    }
    Instant answer = Instant.ofEpochSecond(fullval / 10000000 + DATETIME_EPOCH_DIFF_1601)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59291268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档