簡體   English   中英

將UpperCase中的解析日期解析為LocalDate

[英]Parsing Date in UpperCase to LocalDate

我正在嘗試將字符串FEBRUARY 2019解析為LocalDate

這是我的方法:

LocalDate month = LocalDate.parse("FEBRUARY 2019", DateTimeFormatter.ofPattern("MMMM yyyy"));

或者設置Locale.US

LocalDate month = LocalDate.parse("FEBRUARY 2019", DateTimeFormatter.ofPattern("MMMM yyyy", Locale.US));

但我得到的是以下異常:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'FEBRUARY 2019' could not be parsed at index 0

首先,我建議你得到的輸入不是約會 - 這是一年零一個月。 因此解析為YearMonth ,然后根據需要創建一個LocalDate 我發現最簡單的方法是使文本處理代碼處理文本處理,並在您已經處於日期/時間域時單獨執行任何其他轉換。

若要處理區分大小寫問題,可以使用不區分大小寫的解析創建DateTimeFormatter 這是一個完整的例子:

import java.time.*;
import java.time.format.*;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        // Note: this would probably be a field somewhere so you don't need
        // to build it every time.
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern("MMMM yyyy")
            .toFormatter(Locale.US);

        YearMonth month = YearMonth.parse("FEBRUARY 2019", formatter);
        System.out.println(month);
    }
}

如果您有不同的表示形式,可以使用另一種方法,您可以構建一個映射並將其傳遞給DateTimeFormatterBuilder.appendText (我只是在以某種方式搞砸代碼時才發現這個。)

import java.time.*;
import java.time.format.*;
import java.time.temporal.*;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        // TODO: Build this map up programmatically instead?            
        Map<Long, String> monthNames = new HashMap<>();
        monthNames.put(1L, "JANUARY");
        monthNames.put(2L, "FEBRUARY");
        monthNames.put(3L, "MARCH");
        monthNames.put(4L, "APRIL");
        monthNames.put(5L, "MAY");
        monthNames.put(6L, "JUNE");
        monthNames.put(7L, "JULY");
        monthNames.put(8L, "AUGUST");
        monthNames.put(9L, "SEPTEMBER");
        monthNames.put(10L, "OCTOBER");
        monthNames.put(11L, "NOVEMBER");
        monthNames.put(12L, "DECEMBER");

        // Note: this would probably be a field somewhere so you don't need
        // to build it every time.
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.MONTH_OF_YEAR, monthNames)
            .appendLiteral(' ')
            .appendPattern("yyyy")
            .toFormatter(Locale.US);

        YearMonth month = YearMonth.parse("FEBRUARY 2019", formatter);
        System.out.println(month);
    }
}

正如Jon Skeet所說,你沒有完整的解析日期,可以使用YearMonth。 另一種方法是指定默認日期。

除了提供月份名稱映射的方法之外,您還可以簡單地使用諸如WordUtils之類的庫將輸入轉換為正確的格式,例如:

final LocalDate month = LocalDate.parse(
        org.apache.commons.text.WordUtils.capitalizeFully("FEBRUARY 2019"),
        new DateTimeFormatterBuilder()
                    .appendPattern("MMMM uuuu")
                    .parseCaseInsensitive()
                    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                    .toFormatter(Locale.US));

暫無
暫無

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

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