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

如何在Java中将本地时间转换为LDAP时间戳,java,datetime,ldap,Java,Datetime,Ldap,我想得到两个LDAP格式的时间戳,一个必须是一天的开始,另一个必须是一天的结束。它可以通过使用Java8(使用Joda Time)来完成,但是有没有办法使用像Java7这样的较低版本 这是我在网上找到的最接近的解决方案,但我不知道如何获取一天开始和结束的时间戳。此外,我还需要检查15天以前的情况(从当前系统时间算起,从一天的开始到一天的结束) 要将Win32 filetime字符串转换为日期,请使用: long fileTime = (Long.parseLong(inputDateSt

我想得到两个LDAP格式的时间戳,一个必须是一天的开始,另一个必须是一天的结束。它可以通过使用Java8(使用Joda Time)来完成,但是有没有办法使用像Java7这样的较低版本

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

要将Win32 filetime字符串转换为日期,请使用:

    long fileTime = (Long.parseLong(inputDateString) / 10000L) - + 11644473600000L;
    Date inputDate = new Date(fileTime);
要将日期转换为Win32 filetime,请使用:

    long fileTime = (inputDate.getTime() + 11644473600000L) * 10000L;
    String outputDate = Long.toString(fileTime);
e、 g.131220409910000000将转换为2016/10/27 14-23-11,反之亦然

检查此url以获得一个很好的在线Epoc/filetime转换器:


您可以尝试以下方法:

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和三百一十个后端口 输出为(在jdk1.7.0_67上测试):

132114384000000000

一天的开始时间因时区而异。我以美国/太子港为例,你需要自己选择。如果需要,请使用
ZoneOffset.UTC

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

我正在使用java.time,这是现代的java日期和时间API。我们不想在Java中使用
Date
Calendar
或其他设计糟糕且过时的日期和时间类。使用java.time更方便

问:有没有办法使用像Java7这样的较低版本? 是的,java.time在Java7上运行得很好。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在Java6和Java7中,获取三个后端口,即现代类的后端口(三个十用于JSR310;参见底部的链接)
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

如何使用Java 7实现这一点?所需的结果是什么样的?使用
SimpleDataFormat
string
yyyyMMddHHmmssX
。我想将:2019年7月18日12:15:02 PM IST时间格式转换为LDAP时间中使用的格式:13207905900285699相同的已在Java 7中实现添加到您的项目中,并以与在Java 8中相同的方式执行(无论如何,如果您告诉我们,可能会有所帮助)。java.time是现代java日期和时间API,在JSR-310中进行了描述,并在三十个Backport中被后传到Java6和Java7。
    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);