为不同的时间字符串接收相同的 ZonedDateTime
Receiving same ZonedDateTime for different time strings
我正在使用以下函数将微秒格式的时间字符串转换为 ZoneDateTime
,以便稍后进行比较。
public static ZonedDateTime createTimeFromString(String inputTime) {
ZonedDateTime time;
try {
System.out.printf("Input time %s%n", inputTime);
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSSSSS");
LocalDate date = LocalDate.parse(inputTime, formatter);
time = date.atStartOfDay(ZoneId.systemDefault());
System.out.printf("Formated time %s%n", time);
return time;
}
catch (DateTimeParseException exc) {
System.out.printf("%s is not parsable!%n", inputTime);
throw exc; // Rethrow the exception.
}
}
但是,无论我将什么时间字符串传递给函数,我都会得到相同的输出。
例如:
Input time 20171025-10:58:24.062151
Formated time 2017-10-25T00:00+05:30[Asia/Colombo]
Input time 20171025-10:58:25.446862
Formated time 2017-10-25T00:00+05:30[Asia/Colombo]
我正在使用 Java 8.
你能澄清一下我做错了什么吗?
当您调用 LocalDate.parse
时,您只会获得日期部分(日、月和年)并丢弃其余部分。 LocalDate
没有时间字段(小时、分钟、秒和秒的小数部分),因此它们被简单地丢弃和丢失。
然后调用 atStartOfDay(ZoneId.systemDefault())
,将时间设置为 JVM 默认时区的午夜。
如果您想保留所有内容(日期和时间),请将其解析为 LocalDateTime
,这是一个包含所有日期和时间字段的 class。然后调用 atZone
方法将其转换为 ZonedDateTime
:
String inputTime = "20171025-10:58:24.062151";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSSSSS");
// parse to a LocalDateTime (keeping all date and time fields)
LocalDateTime date = LocalDateTime.parse(inputTime, formatter);
// convert to ZonedDateTime
ZonedDateTime z = date.atZone(ZoneId.systemDefault());
PS: ZoneId.systemDefault()
returns JVM 默认时区,但请记住这个 ,所以它是最好始终明确说明您使用的是哪一个。
API 使用 IANA timezones names(格式总是 Region/City
,如 Asia/Colombo
或 Europe/Berlin
)。
避免使用 3 个字母的缩写(如 IST
或 CET
),因为它们是 ambiguous and not standard.
您可以通过调用 ZoneId.getAvailableZoneIds()
获得可用时区列表(并选择最适合您的系统的时区)。然后用区域名称调用 ZoneId.of()
方法,如下所示:
// using specific timezone instead of JVM's default
ZonedDateTime z = date.atZone(ZoneId.of("Asia/Colombo"));
我正在使用以下函数将微秒格式的时间字符串转换为 ZoneDateTime
,以便稍后进行比较。
public static ZonedDateTime createTimeFromString(String inputTime) {
ZonedDateTime time;
try {
System.out.printf("Input time %s%n", inputTime);
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSSSSS");
LocalDate date = LocalDate.parse(inputTime, formatter);
time = date.atStartOfDay(ZoneId.systemDefault());
System.out.printf("Formated time %s%n", time);
return time;
}
catch (DateTimeParseException exc) {
System.out.printf("%s is not parsable!%n", inputTime);
throw exc; // Rethrow the exception.
}
}
但是,无论我将什么时间字符串传递给函数,我都会得到相同的输出。
例如:
Input time 20171025-10:58:24.062151
Formated time 2017-10-25T00:00+05:30[Asia/Colombo]
Input time 20171025-10:58:25.446862
Formated time 2017-10-25T00:00+05:30[Asia/Colombo]
我正在使用 Java 8.
你能澄清一下我做错了什么吗?
当您调用 LocalDate.parse
时,您只会获得日期部分(日、月和年)并丢弃其余部分。 LocalDate
没有时间字段(小时、分钟、秒和秒的小数部分),因此它们被简单地丢弃和丢失。
然后调用 atStartOfDay(ZoneId.systemDefault())
,将时间设置为 JVM 默认时区的午夜。
如果您想保留所有内容(日期和时间),请将其解析为 LocalDateTime
,这是一个包含所有日期和时间字段的 class。然后调用 atZone
方法将其转换为 ZonedDateTime
:
String inputTime = "20171025-10:58:24.062151";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSSSSS");
// parse to a LocalDateTime (keeping all date and time fields)
LocalDateTime date = LocalDateTime.parse(inputTime, formatter);
// convert to ZonedDateTime
ZonedDateTime z = date.atZone(ZoneId.systemDefault());
PS: ZoneId.systemDefault()
returns JVM 默认时区,但请记住这个
API 使用 IANA timezones names(格式总是 Region/City
,如 Asia/Colombo
或 Europe/Berlin
)。
避免使用 3 个字母的缩写(如 IST
或 CET
),因为它们是 ambiguous and not standard.
您可以通过调用 ZoneId.getAvailableZoneIds()
获得可用时区列表(并选择最适合您的系统的时区)。然后用区域名称调用 ZoneId.of()
方法,如下所示:
// using specific timezone instead of JVM's default
ZonedDateTime z = date.atZone(ZoneId.of("Asia/Colombo"));