gpt4 book ai didi

java - 解析 LDAP 日期和时间戳时设置的时区与 GMT 不一致

转载 作者:行者123 更新时间:2023-12-02 03:33:47 26 4
gpt4 key购买 nike

我正在解析公元的时间。有两种格式,即,YMD LDAP时间戳用于whenCreated、whenChanged,18位LDAP/FILETIME时间戳用于lastLogonTimestamp、pwdLastSet等。因为我需要根据时间来分析数据。获取本地时间是有意义的。这是我编写的用于解析两种不同格式的两个函数。我引用的第二个函数中的计算 Convert 18-digit LDAP Timestamps To Human Teadable Date Using Java

public static String parseLdapDate(String ldapDate) {
String[] parts = ldapDate.split("[.]");
String dateTimePart = parts[0]; //take the date string before .0Z
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); //Z means UTC time, to the local timezone
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {
Date tempDate = sdf.parse(dateTimePart); //parse the string to a date
return formatter.format(tempDate); //format it as what we want
} catch (ParseException ex) {
System.out.println("Parsing LDAP Date exception \n");
ex.printStackTrace();
}
return null;
}

public static String parseLdapTimestamp(String ldapTimestamp) {
long nanoseconds = Long.parseLong(ldapTimestamp); // 100 nanoseconds
long mills = (nanoseconds/10000000); // To seconds
long unix = (((1970-1601)*365)-3+Math.round((1970-1601)/4))*86400L;
long timeStamp = mills - unix;

Date date = new Date(timeStamp*1000L); // To milliseconds
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

return sdf.format(date);
}

我有一个示例 20150520143936.0Z,它被转换为“2015-05-20 16:39:36”。对于示例 131097986571852097,它会转换为“2016-06-07 18:44:17”,而 http://www.epochconverter.com/ldap告诉我现在是 GMT 时间,本地时间是“2016-06-07 20:44:17”。如果我评论设置时区的代码,我将获得本地时间。

所以现在我很困惑,sdf.setTimeZone(TimeZone.getTimeZone("GMT"));给了我本地时区或通用时间。我在想AD是否将whenCreated存储在通用时间中,lastLogonTimestamp存储在本地时间中。但在函数中我将它们解析为字符串。没有关于时区的符号。如果我在第二个函数中注释这句话,当我在另一个地方访问 LDAP 目录时,我是否会获得这两个属性的本地时间。

最佳答案

在第二种情况下,您要构造一个日期,然后告诉它以 UTC 格式格式化该日期 - 而在第一种情况下,您>以 UTC 解析,但以本地时间格式化。您已经假设时间戳存储为自 Unix 纪元以来的多个刻度,这是一种时区中性格式。

如果目标是生成本地时间的字符串表示形式,那么您应该删除 sdf.setTimeZone 调用。我认为无论如何,解析方法应该返回日期,而不是字符串。或者更好的是,返回一个 java.time.Instant...

关于java - 解析 LDAP 日期和时间戳时设置的时区与 GMT 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37703468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com