编程语言
首页 > 编程语言> > java-为不同的时间字符串接收相同的ZonedDateTime

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

作者:互联网

我正在使用以下函数将微秒格式的时间字符串转换为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,这是一个包含所有日期和时间字段的类.然后,调用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默认时区,但请记住此值为can be changed without notice, even at runtime,因此最好始终使您使用的是明确的.

API使用IANA timezones names(始终以地区/城市格式,例如亚洲/科伦坡或欧洲/柏林).
避免使用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"));

标签:datetime-parsing,java-8,java-time,datetime,java
来源: https://codeday.me/bug/20191025/1929840.html