我们需要在Active Directory中插入accountExpires日期。
并且AD仅将输入日期视为大整数(18位LDAP日期)。
我的日期格式为yyyy-MM-dd
(例如2014-04-29
),我希望将此Java日期转换为LDAP日期18位数格式,即(130432824000000000
)。
请让我知道如何转换以下格式并使用当前日期格式填充广告。
答案 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;
}