接收不同时间字符串的相同 ZonedDateTime

问题描述 投票:0回答:1

我正在使用下面的函数将微秒格式的时间字符串转换为

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。

你能澄清一下我做错了什么吗?

java datetime java-8 java-time datetime-parsing
1个回答
5
投票

当您调用

LocalDate.parse
时,您只会获得日期部分(日、月和年)并丢弃其余部分。
LocalDate
没有时间字段(小时、分钟、秒和秒的小数部分),因此它们只是被丢弃和丢失。

然后调用

atStartOfDay(ZoneId.systemDefault())
,它将时间设置为每个 JVM 默认时区的“当天的第一时刻”。 (通常第一个时刻是 00:00,但某些区域的某些日期可能会在其他时间开始,例如 01:00。) 如果您想保留所有内容(日期和时间),请将其解析为

LocalDateTime

,这是一个包含所有日期和时间字段的类。然后调用

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() 返回 JVM 默认时区,但请记住,即使在运行时,也可以在不通知的情况下更改此时区,因此最好始终明确您正在使用哪个时区。

API 使用 IANA 时区名称(始终采用 

Region/City

格式,如 Asia/Colombo

Europe/Berlin
)。 避免使用 3 个字母的缩写(如
IST
CET
),因为它们
不明确且不标准
您可以通过调用 ZoneId.getAvailableZoneIds() 获取可用时区列表(并选择最适合您系统的时区)。然后使用区域名称调用 

ZoneId.of()

方法,如下所示:

// using specific timezone instead of JVM's default
ZonedDateTime z = date.atZone(ZoneId.of("Asia/Colombo"));
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.