将java日期转换为18位LDAP日期

时间:2014-03-10 08:59:59

标签: java ldap

我们需要在Active Directory中插入accountExpires日期。 并且AD仅将输入日期视为大整数(18位LDAP日期)。 我的日期格式为yyyy-MM-dd(例如2014-04-29),我希望将此Java日期转换为LDAP日期18位数格式,即(130432824000000000)。

请让我知道如何转换以下格式并使用当前日期格式填充广告。

4 个答案:

答案 0 :(得分:3)

这是使用Joda Time的解决方案,根据找到的定义here

  

时间戳是自1601年1月1日以来100纳秒间隔(1纳秒=十亿分之一秒)的数量。

示例代码:

public final class Foo
{
    private static final DateTime LDAP_START_DATE
        = new DateTime(1601, 1, 1, 0, 0, DateTimeZone.UTC);

    public static void main(final String... args)
    {
        final DateTime now = DateTime.now();
        final Interval interval = new Interval(LDAP_START_DATE, now);
        System.out.println(interval.toDurationMillis() * 10000);
    }
}

将此代码中的now替换为您的日期,您应该设置。

答案 1 :(得分:3)

这是基于JDK的解决方案

    Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    c.clear();
    c.set(2014, 3, 29);
    long t1 = c.getTimeInMillis();
    c.set(1601, 0, 1);
    long t2 = c.getTimeInMillis();
    long ldap = (t1 - t2) * 10000;

答案 2 :(得分:1)

我花了一些时间使用java.time API编写LDAP时间戳转换器 (Java 8)。

也许这个小工具会帮助像我这样的人(当我寻找合适的解决方案时,我一直在这里)。

import java.time.*;

public class LdapTimestampUtil {

    /**
     * Microsoft world exist since since Jan 1, 1601 UTC
     */
    public static final ZonedDateTime LDAP_MIN_DATE_TIME = ZonedDateTime.of(1601, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC"));

    public static long instantToLdapTimestamp(Instant instant) {
        ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneOffset.UTC);
        return zonedDateToLdapTimestamp(zonedDateTime);
    }

    public static long localDateToLdapTimestamp(LocalDateTime dateTime) {
        ZonedDateTime zonedDateTime = dateTime.atZone(ZoneId.systemDefault());
        return zonedDateToLdapTimestamp(zonedDateTime);
    }

    public static long zonedDateToLdapTimestamp(ZonedDateTime zonedDatetime) {
        Duration duration = Duration.between(LDAP_MIN_DATE_TIME, zonedDatetime);
        return millisecondsToLdapTimestamp(duration.toMillis());
    }

    /**
     * The LDAP timestamp is the number of 100-nanoseconds intervals since since Jan 1, 1601 UTC
     */
    private static long millisecondsToLdapTimestamp(long millis) {
        return millis * 1000 * 10;
    }

}

我在GitHub上发布了完整的工具: https://github.com/PolishAirports/ldap-utils

答案 3 :(得分:1)

这对我来说很好:

static String parseLdapDate(String ldapDate) {

            long nanoseconds = Long.parseLong(ldapDate);   // nanoseconds since target time that you want to convert to java.util.Date

            long mills = (nanoseconds / 10000000);

            long unix = (((1970 - 1601) * 365) - 3 + Math.round((1970 - 1601) / 4)) * 86400L;

            long timeStamp = mills - unix;

            Date date = new Date(timeStamp * 1000L); // *1000 is to convert seconds to milliseconds
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); // the format of your date
    //        sdf.setTimeZone(TimeZone.getTimeZone("GMT")); // give a timezone reference for formating (see comment at the bottom
            String formattedDate = sdf.format(date);

            return  formattedDate;
        }