簡體   English   中英

解析 2 位數年份:使用未知日期模式設置樞軸日期

[英]Parsing 2-digit years: Setting the pivot date with an unknown date pattern

用戶將以不同的模式向我的應用程序輸入日期。 對於兩位數的年份,他還必須確定樞軸日期。


例子:
模式 = yy-MM-dd
樞軸日期 = 70 (我以編程方式添加了當前的千禧年和上個世紀以獲得更多動態 => 1970

69-04-22變成2069-04-22
70-04-22變成1970-04-22


就像在這個答案中描述的那樣,當日期模式(這里是ddMMyy )已知時,很容易構建一個DateTimeFormatter
但是由於用戶輸入了模式,我不確定如何正確構建DateTimeFormatterBuilder 我無法對其進行硬編碼。

我必須自己解析模式並以正確的順序調用appendPattern()appendValueReduced()嗎? 或者是否有內置解決方案?

這里是 Java-8 解決方案(它看起來更像是一個 hack):

String pattern = "MM/dd/yy 'US'"; // user-input
String text = "10/04/69 US"; // user-input
Locale locale = Locale.US; // user-input, too?

int yy = pattern.indexOf("yy");
DateTimeFormatter dtf;

if (
    (yy != -1) // explanation: condition ensures exactly two letters y
    && ((yy + 2 >= pattern.length()) || pattern.charAt(yy + 2) != 'y')
) {
    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
    String part1 = pattern.substring(0, yy);
    if (!part1.isEmpty()) {
        builder.appendPattern(part1);
    }
    builder.appendValueReduced(ChronoField.YEAR, 2, 2, 1970);
    String part2 = pattern.substring(yy + 2);
    if (!part2.isEmpty()) {
        builder.appendPattern(part2);
    }
    dtf = builder.toFormatter(locale);
} else {
    dtf = DateTimeFormatter.ofPattern(pattern, locale);
}

LocalDate ld = LocalDate.parse(text, dtf);
System.out.println("user-date: " + ld); // 2069-10-04

只有一個小小的警告:如果任何用戶有瘋狂的想法在模式中分別定義兩次“yy”,那么提議的解決方案將失敗。 正確的解決方案將需要對模式字符進行某種迭代,但我認為這是矯枉過正,所以我把它留在這里。

只是為了比較,使用我的外部庫 Time4J 可以實現以下簡短的解決方案,因為它的解析引擎還具有設置任何合適格式屬性的概念:

LocalDate ld = 
  ChronoFormatter.ofDatePattern(pattern, PatternType.CLDR, locale)
  .with(Attributes.PIVOT_YEAR, 2070).parse(text).toTemporalAccessor();

暫無
暫無

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

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