簡體   English   中英

以正確的格式將 LocalDate 解析為 ZonedDateTime

[英]Parsing LocalDate to ZonedDateTime in correct format

鑒於:

public static void main(String[] args) {

   String dateString = "2018-07-30T13:36:17.820";

    DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
            .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

    LocalDate date = LocalDate.parse(dateString, DATE_TIME_FORMATTER);

    ZonedDateTime zonedDateTime = date.atStartOfDay((ZoneOffset.UTC));

    System.out.println(zonedDateTime);
}

和 output:

2018-07-30T00:00Z

...打印秒的模式是什么? 毫無疑問是愚蠢的問題,但讓我有點發瘋

我需要:

2018-07-30T00:00:00Z

我將java.time.LocalDate更改為java.time.LocalDateTime ,如果您還想顯示秒數,則需要它。

package com.test;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class DateFormatter {

    public static void main(String[] args) {

        String dateString = "2018-07-30T13:36:17.820";

        DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
                .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

        LocalDateTime date = LocalDateTime.parse(dateString, DATE_TIME_FORMATTER);

        ZonedDateTime zonedDateTime = date.atZone(ZoneOffset.UTC);


        System.out.println(zonedDateTime);
    }
}

Output 是:

2018-07-30T13:36:17.820Z

LocalDate 將保持日期。 您需要解析 LocalDateTime 並轉換為 ZonedDateTime 並且您將擁有預期的秒數。

    var dateString = "2018-07-30T13:36:17.820";
    var format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
    var localDate = LocalDateTime.parse(dateString, format);
    var zone = ZoneId.of( "America/Montreal" );
    var zonedDateTime = localDate.atZone(zone);
    System.out.println(zonedDateTime);

您將不得不 go 幾個步驟:

  • String解析為LocalDateTime ,因為它包含日期和時間
  • 僅提取日期
  • 通過添加一天的開始( LocalTime.MIN = 00:00:00 )和ZoneOffset.UTC ZonedDateTime

此代碼可能會:

public static void main(String[] args) {
    String dateString = "2018-07-30T13:36:17.820";
    // parse a LocalDateTime
    LocalDateTime localDateTime = LocalDateTime.parse(dateString);
    // extract the date part
    LocalDate localDate = localDateTime.toLocalDate();
    // make it a ZonedDateTime by applying a ZoneId
    ZonedDateTime zonedDateTime = ZonedDateTime.of(localDate, LocalTime.MIN, ZoneOffset.UTC);
    // print the result
    System.out.println(zonedDateTime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
}

Output 是

2018-07-30T00:00:00Z

有幾種方法可以做到這一點,這只是其中之一,它與大多數其他答案(和評論:-) 略有不同。

tl;博士

你在錯誤的地方使用了錯誤的東西。

  1. 您不需要DateTimeFormatter明確地解析2018-07-30T13:36:17.820因為它已經采用ISO 8601格式,這也是LocalDateTime#parse使用的默認格式。 此外,這個字符串有日期和時間,而不僅僅是日期; 因此,將其解析為LocalDateTime而不是LocalDate更有意義。 您始終可以使用LocalDateTime#toLocalDateLocalDateTime獲取LocalDate
  2. ZonedDateTime#toString使用LocalDateTime#toString反過來使用LocalTime#toString作為時間部分,如果它們為零,則省略秒和秒的分數。 如果您需要零秒和小數秒的字符串,則需要使用DateTimeFormatter

演示:

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String args[]) {
        String dateString = "2018-07-30T13:36:17.820";

        LocalDateTime localDateTime = LocalDateTime.parse(dateString);// You do not need a DateTimeFormatter here

        ZonedDateTime zonedDateTime = localDateTime.toLocalDate().atStartOfDay(ZoneOffset.UTC);

        // Print zonedDateTime.toString()
        System.out.println(zonedDateTime);

        // Custom format
        final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
        System.out.println(DATE_TIME_FORMATTER.format(zonedDateTime));
    }
}

Output:

2018-07-30T00:00Z
2018-07-30T00:00:00.000

Trail: Date Time了解有關現代日期時間 API 的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM