转换ldap日期

Udo*_*eld 9 java ldap

我正在以编程方式从ldap导出用户.因此我正在从ldap中检索用户.其中一个属性是whenCreated.

我必须转换的一个值是:20090813145607.0Z直接拆分我得到以下格式:yyyyMMddHHmmss+ .0Z.问题是应用程序在CET时区运行,存储的时间是UTC,可能由表示.0Z.它是14:56 UTC和当地的代表16:56.夏季时间似乎是2小时,冬季则是1小时.

我检查了SimpleDateFormat并且有一个占位符用于时区,但它的格式不同.

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
sdf.parse("20090813145607.0Z");
Run Code Online (Sandbox Code Playgroud)

将显示错误的日期,因为它忽略日期时区.

有没有办法直接转换它?

Bas*_*que 13

ISO 8601

正如提到的其他几个答案,所讨论的日期时间格式由RFC 4517 轻量级目录访问协议(LDAP)定义:语法和匹配规则.见3.3.13,广义时间.

该部分解释了此LDAP格式是ISO 8601定义的日期时间格式之一的受限版本.使用最少分隔符的这种样式在ISO 8601中称为"基本".

在这些格式中,Z最后是简短的Zulu并且意味着UTC(基本上与GMT相同).

末尾的小数点和数字代表一小部分.请注意,在RFC 4517和ISO 8601中都可以使用逗号代替点(句点).实际上,建议使用逗号来表示ISO 8601中的点.RFC 4517规范仅允许单个数字部分(十分之一的十分之一) )或者根本没有点/逗号和数字.请注意,相反:(a)ISO 8601允许任意数量的小数位数,(b)java.time对象具有纳秒分辨率,最多可达9位小数秒.

java.time

java.time框架是建立在Java 8和更高版本.这些类取代旧的麻烦日期时间类,如java.util.Date,.Calendar,和java.text.SimpleDateFormat.

现在处于维护模式,Joda-Time项目还建议迁移到java.time.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.

大部分java.time功能都在ThreeTen- Backport中反向移植到Java 6和7,并进一步适用于ThreeTenABP中的 Android .

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.

解析

定义格式模式以适应RFC 4517.研究DateTimeFormatter模式编码的类.这应该工作:uuuuMMddHHmmss[,S][.S]X.方括号表示可选.我们可以使用点或逗号.注意单位数的秒数.该X对端允许为任何一个Z或一个偏移从-UTC如-08或-0830或-08:30或-083015或-08:30:15.

String input = "20090813145607.0Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuuMMddHHmmss[,S][.S]X" );
OffsetDateTime odt = OffsetDateTime.parse ( input , f );
Instant instant = odt.toInstant ();
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "input: " + input + " | odt: " + odt + " | instant: " + instant );
Run Code Online (Sandbox Code Playgroud)

输入:20090813145607.0Z | odt:2009-08-13T14:56:07Z | 时间:2009-08-13T14:56:07Z

当然java.time.format.DateTimeParseException,如果出现意外输入,您还应该对支票进行编码.


hig*_*ted 6

如何使用上面描述的拆分,然后将0Z时区重新格式化为标准格式,然后使用sdf.parse(...)?也许这样的事情(当然添加了适当的错误检查):

String[] parts = inputDateTime.split("[.]");
String dateTimePart = parts[0];
String timeZonePart = "+0" + parts[1].substring(0, parts[1].length() - 1) + "00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssZ");
Date theDate = sdf.parse(dateTimePart + timeZonePart);
Run Code Online (Sandbox Code Playgroud)


Udo*_*eld 6

检查上面提到的RFC似乎使用UTC是ldap日期的推荐默认行为.因此我直接转换了它:

public Date parseLdapDate(String ldapDate){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

    try {
        return sdf.parse(ldapDate);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)