![](/img/trans.png)
[英]ZonedDateTime format and parsing exception with “z” in format pattern
[英]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
有幾種方法可以做到這一點,這只是其中之一,它與大多數其他答案(和評論:-) 略有不同。
你在錯誤的地方使用了錯誤的東西。
DateTimeFormatter
明確地解析2018-07-30T13:36:17.820
因為它已經采用ISO 8601格式,這也是LocalDateTime#parse
使用的默認格式。 此外,這個字符串有日期和時間,而不僅僅是日期; 因此,將其解析為LocalDateTime
而不是LocalDate
更有意義。 您始終可以使用LocalDateTime#toLocalDate
從LocalDateTime
獲取LocalDate
。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.