Java 如何将本地时间转换为 LDAP 时间戳

How to convert local time to LDAP timestamp in Java

我想获得两个 LDAP 格式的时间戳,一个必须是一天的开始,另一个必须是一天的结束。可以通过使用 Java 8(使用 Joda-Time)来完成,但是有没有办法使用像 java 7.

这样的低版本

这是我在网上找到的最接近的解决方案,但我不知道如何获取一天开始和一天结束的时间戳。另外我需要检查 15 天前(从当前系统时间开始到一天结束)

要将 Win32 文件时间字符串转换为日期,请使用:

    long fileTime = (Long.parseLong(inputDateString) / 10000L) - + 11644473600000L;
    Date inputDate = new Date(fileTime);

要将日期转换为 Win32 文件时间,请使用:

    long fileTime = (inputDate.getTime() + 11644473600000L) * 10000L;
    String outputDate = Long.toString(fileTime);

例如131220409910000000 将转换为 2016/10/27 14-23-11,反之亦然

检查此 url 以获得不错的在线 epoch/filetime 转换器:

http://www.epochconverter.com/ldap

您可以尝试以下方法:

Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
c.clear();
c.set(2016, 4, 22); //your date
long time1= c.getTimeInMillis();
c.set(1601, 0, 1);
long time2= c.getTimeInMillis();
long ldap = (time1- time2) * 10000;

java.time 和 ThreeTen 向后移植

    Instant ldapEpoch = Instant.parse("1601-01-01T00:00:00Z");
    ZoneId zone = ZoneId.of("America/Port-au-Prince");

    LocalDate date = LocalDate.now(zone);
    Instant startOfDay = date.atStartOfDay(zone).toInstant();
    Duration sinceLdapEpoch = Duration.between(ldapEpoch, startOfDay);
    assert sinceLdapEpoch.getNano() == 0 : sinceLdapEpoch;
    long ldapTimestamp = sinceLdapEpoch.getSeconds() * 10_000_000;
    System.out.println(ldapTimestamp);

输出是(在 jdk1.7.0_67 上测试):

132114384000000000

一天的开始因时区而异。我以 America/Port-au-Prince 为例,您需要自己选择。如果需要,请使用 ZoneOffset.UTC

一天结束时,在同一计算中使用 date.plusDays(1) 而不是 date。这会给你第二天的第一刻。您可以改用当天的最后一刻吗?不,你也不应该想要。一天没有最后一刻。一天是从当天的第一个时刻到第二天的第一个时刻不包括的半开时间间隔。在编程中最好和正确的方法是这样处理它(你当然可以作弊并从你得到的结果中减去 1 以获得当天最后一个可能的 LDAP 时间戳 , 不推荐).

我正在使用 java.time,现代 Java 日期和时间 API。我们不想在 Java 中使用 DateCalendar 或其他设计不良且过时已久的日期和时间 类。 java.time 更好用。

问题:有没有办法使用像 java 7 这样的低版本?

是的,java.time 在 Java 7 上工作得很好。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置了现代 API。
  • 在 Java 6 和 7 中获取现代 类 的 ThreeTen Backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接