[英]convert String to date using java 8 and format -> 'uuuu-MM-dd'
[英]Parsing a date with pattern 'dd MMMMM uuuu' using DateTimeFormatter
為什么這段代碼給我一個異常?
String myFormat = "dd MMMMM uuuu";
String dateToFormat = "26 Mai 2010";
DateTimeFormatter myFormatter = new DateTimeFormatterBuilder().appendPattern(myFormat)
.toFormatter().withResolverStyle(ResolverStyle.STRICT);
LocalDate myDate=LocalDate.parse(dateToFormat,myFormatter);
例外:
java.time.format.DateTimeParseException: Text '26 Mai 2010' could not be parsed at index 4
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDate.parse(LocalDate.java:400)
如果我嘗試使用“ MMMM”而不是“ MMMMM”,它將按預期工作。
String myFormat = "dd MMMM uuuu";
正如DateTimeFormatter
的javadoc解釋的那樣,我引用: 恰好4個模式字母將使用完整格式。 恰好5個圖案字母將使用窄幅形式。
我也不知道為什么。 窄形式實際上非常短,大概幾個月以來,這是第一個字母,這是非常沒有用的,例如,六月和七月都以J開頭(即使是德語)。 解決這類問題的最簡單方法是逆向操作:獲取一個已知日期並使用.format
而不是.parse
來查看其外觀。
您想要的是字母M的4倍,字母M是月份的全名。
正如一些評論所言,它的確切功能將取決於您的系統區域設置,這會使測試和建議變得更加困難。 通常,您應該始終明確選擇語言環境。 您可以調用withLocale
方法來強制執行此操作。
以下是一些示例代碼:
import java.time.*; import java.time.format.*; import java.util.*;
public class Test {
public static void main(String[] args) {
String myFormatNarrow = "dd MMMMM uuuu";
String myFormatFull = "dd MMMM uuuu";
String dateToFormat = "26 Juni 2010";
String dateToFormat2 = "26 J 2010";
String dateToFormat3 = "26 Jun 2010";
DateTimeFormatter myFormatter;
LocalDate myDate;
myFormatter = new DateTimeFormatterBuilder().appendPattern(myFormatFull)
.toFormatter().withResolverStyle(ResolverStyle.STRICT).withLocale(Locale.GERMAN);
System.out.println("FULL: " + myFormatter.format(LocalDate.of(2010, 6, 26)));
myDate = LocalDate.parse(dateToFormat, myFormatter);
System.out.println("PARSED: " + myDate);
myFormatter = new DateTimeFormatterBuilder().appendPattern(myFormatNarrow)
.toFormatter().withResolverStyle(ResolverStyle.STRICT).withLocale(Locale.GERMAN);
System.out.println("NARROW: " + myFormatter.format(LocalDate.of(2010, 6, 26)));
myDate = LocalDate.parse(dateToFormat2, myFormatter);
// It parses a single J as 'july'. Clearly showing why narrow-form is useless here.
System.out.println("PARSED: " + myDate);
// note that even ResolverStyle.LENIENT can't do it either; this will fail:
myFormatter = myFormatter.withResolverStyle(ResolverStyle.LENIENT);
// myDate = LocalDate.parse(dateToFormat3, myFormatter);
// System.out.println("PARSED: " + myDate);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.