-1

我正在尝试计算 LDAP accountExpires。给定的值是 LDAP 日期-纳秒以来01/01/1601 00:00

测试它是否确实是 after 的最佳方法是new Date()什么?

4

1 回答 1

2

最好的方法可能取决于您的精度要求。我建议

private static final Instant ldapEpoch = LocalDateTime.of(1601, Month.JANUARY, 1, 0, 0)
                                .atOffset(ZoneOffset.UTC)
                                .toInstant();

接着

long ldapTime = 131_428_662_140_000_000L;
Instant convertedTime = ldapEpoch.plusMillis( ldapTime / 10_000L );
System.out.println(convertedTime.isAfter(Instant.now()));

对于我的示例 LDAP 时间值,这会产生一个Instantof2017-06-25T12:10:14Z并打印false,因为时间不在当前时间之后。

既然您new Date()在问题中提到,我认为 的精度Date对您来说就足够了,即毫秒。我真的很想ldapEpoch.plusNanos(ldapTime * 100)保持完整的精度,但这会溢出 Javalong数据类型,因此会给出不正确的结果。如果您需要完整的精度,...编辑:根据 Basil Bourque 在评论中的建议,切掉小数秒,在整秒内工作,然后加回小数秒:

    Instant convertedTime = ldapEpoch.plusSeconds( ldapTime / 10_000_000L )
                                    .plusNanos( ldapTime % 10_000_000L * 100L );

(我第一次展示的方式也有效,但结果相同;但是对于了解 Java 日期和时间 API 的读者来说,编辑后的版本可能更自然(并且性能也可能稍微好一点,但这并不重要)。)

为什么我想乘以 100?我发现的LDAP、Active Directory 和文件时间时间戳转换器显示“时间戳是自 1601 年 1 月 1 日 UTC 以来的 100 纳秒间隔数(1 纳秒 = 十亿分之一秒)。”</p>

请注意,在 1601 年,并非所有人都同意日历,因此当年的 1 月 1 日是模棱两可的。大多数计算机软件都假定公历,所以我猜LDAP时间的定义也是如此,这不是我所知道的。

于 2017-06-25T12:40:30.223 回答