民國年月日格式化工具:RocDateUtils

雖然JDK8已提供方法可格式化日期物件為民國年,但是對於含有民國前資料的專案來說,還是會遇到幾個問題。

第一個問題是民國前年份的表示方式,例如1911年為民國前一年,在許多資料慣例以 -1 表示,但JDK中會顯示為0; 另外一個問題,若輸出樣式為‘民國Y年’時應顯示「民國前1年較為合理,而非「民國-1年」; 再來另一個有時會見到的需求是:以中文數值格式輸出「民國一0X年、民國一二0年」樣式。

RocDateUtils.format()

UDE 提供RocDateUtils.format(…),專門處理民國年月日的顯示轉換。 至於西元年月日部分,因為JDK/3RD Party library皆已有許多現成套件可方便使用,UDE就不另處理。

  • 年份格式:twy / y

UDE所採行的日期樣式原則上依循 java.time.format. DateTimeFormatter 定義。但額外增加定義以‘twy’表示民國年,等效於yyy。而連續的y在補0時,至多補到3位。

@Test @TestTime("2015/09/05")
public void testTWY() {
    assertEquals("1040905", format(Now.date(), "twyMMdd"));
    assertEquals("104/09/05", format(Now.date(), "yyy/MM/dd"));
}

@Test @TestTime("1978/09/05")
public void testLength() {
    assertEquals("67/9/5", format(Now.date(), "y/M/d"));
    assertEquals("67/9/5", format(Now.date(), "yy/M/d"));
    assertEquals("067/9/5", format(Now.date(), "yyy/M/d"));
    assertEquals("067/9/5", format(Now.date(), "yyyy/M/d"));
}
  • 對具「民國」字樣的PATTERN,自動轉換輸出後的「-」為「前」字。
@Test
@TestTime("1911/09/05")
public void testFormatDate_BeforeMinguo() {
  assertEquals("-1/9/5", format(Now.date(), "y/d"));
  assertEquals("-1/9/5", format(Now.date(), "yy/M/d"));
  assertEquals("-01/9/5", format(Now.date(), "yyy/M/d"));
  assertEquals("-01/9/5", format(Now.date(), "twy/M/d"));
  assertEquals("-01/9/5", format(Now.date(), "yyyy/M/d"));
  assertEquals("民國前1年9月5日", format(Now.date(), "民國y年M月d日"));
  assertEquals("民國前01年09月05日", format(Now.date(), "民國yy年MM月dd日"));
  assertEquals("民國前001年09月05日", format(Now.date(), "民國yyy年MM月dd日"));
}

搭配中文數值格式輸出

可直接選用ChineseNumberType輸出完整中文格式日期,此時年份長度(yyy)定義無作用,因為沒辦法補 0。

//@TestTime("2015/09/05")
//以下結果皆為民國一百零四年九月五日
format(Now.date(), "民國y年M月d日", ChineseNumberType.Simple); 
format(Now.date(), "民國yy年M月d日", ChineseNumberType.Simple); 
format(Now.date(), "民國twy年M月d日", ChineseNumberType.Simple); 

//以下結果為民國一0四年九月五日 
format(Now.date(), "民國y年M月d日", ChineseNumberType.MixedForROCYear); 

//@TestTime("2010/12/05")
//以下結果皆為民國九十九年十二月五日
format(Now.date(), "民國y年MM月dd日", ChineseNumberType.Simple);
format(Now.date(), "民國yy年MM月dd日", ChineseNumberType.Simple);
format(Now.date(), "民國twy年MM月dd日", ChineseNumberType.Simple);
format(Now.date(), "民國y年MM月dd日", ChineseNumberType.MixedForROCYear);

results matching ""

    No results matching ""