[英]Cannot format in LocalDate instead of String in Java
我在實體中有以下字段:
private LocalDate birthDate;
我嘗試使用Apache Commons CSV從 CSV 文件中獲取日期字段,並且需要使用我在格式化程序中設置的格式將讀取的日期字段轉換為LocalDate
:
// the read dates in the csv file are like that: 5/14/1974
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// I also tried using the same format
// private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");
// code omittted for brevity
LocalDate.parse(csvRecord.get(Headers.BirthDate), formatter); // gives error
csvRecord.get(Headers.BirthDate)
以字符串格式正確給出日期為4/6/1986
,但LocalDate.parse(...)
無法解析並給出“無法在索引 0 處解析文本 '4/6/1986' “ 錯誤。 那么,我的實現有什么問題? 如果我將 csv 文件中的日期更改為1986/6/1
那么LocalDate.parse()
工作。 也許我需要以這種格式讀取數據,然后轉換為所需的格式。
我可以使用類似的方法,但我需要將日期作為LocalDate
格式而不是String
,這可能是導致錯誤的因素:
public static void main(String[] args) {
Locale.setDefault(Locale.FRANCE);
// no problem now, DateTimeFormatter always uses Locale.US
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy", Locale.US);
String date = "16-Aug-2016";
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println(localDate); //default, print ISO_LOCAL_DATE
System.out.println(formatter.format(localDate)); // print formatted date
}
您在解析數據時遇到異常,因為表示月份的示例字符串中的最小位數(我猜也是一個月中的一天)是1
但根據您的預期模式2
。
你需要這個格式化程序:
String date = "5/14/1974";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy");
System.out.println(LocalDate.parse(date, formatter));
執行時將打印:
1974-05-14
這是文檔中的引用
數字:如果字母數為 1,則使用最小位數輸出值且不進行填充。 否則,位數將用作輸出字段的寬度,必要時將值補零。 以下模式字母對字母數量有限制。 只能指定一個字母“c”和“F”。 最多可以指定兩個字母“d”、“H”、“h”、“K”、“k”、“m”和“s”。 最多可以指定三個字母“D”。
如果您想從已解析的LocalDate
生成一個字符串,該字符串相應地格式化為另一個模式,您可以這樣做:
String dateString = "3/7/1999";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy");
LocalDate date = LocalDate.parse(dateString, formatter);
System.out.println(date);
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy");
System.out.println(date.format(formatter1));
我們可以在創建DateTimeFormatter
時使用localizedBy()
指定一個Local
,但在這種情況下沒有必要這樣做,因為格式化將完全由模式控制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.