在為一些日期助手撰寫單元測驗時,我偶然發現了DateTimeFormatter的一個特殊行為,我想了解如何繞過它。
當輸出年份>9999時,它總是在年份的前面加上一個加號。一些快速的代碼來說明這一點:
LocalDate localDate = LocalDate. of(9999, 1, 1) 。
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"/span>)
cal. set(9999, 0, 1, 12, 0 , 0) 。
//以下斷言通過,因為兩個字串都是 "01-01-9999"。
Assertions.assertEquals(
new SimpleDateFormat("dd-MM-yyyy").format(cal.getTime() )。
localDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
);
localDate = localDate.plusDays(365)。
cal.add(Calendar.Day_OF_MONTH, 365)。
//下面的斷言通過了(使用SimpleDateFormat的冗長作業方法)。
Assertions.assertEquals(
new SimpleDateFormat("dd-MM-yyyy").format(cal.getTime() )。
new SimpleDateFormat("dd-MM-yyy").format(Timestamp.valueOf(localDate.atTime(LocalTime.MIDNIGHT))
);
//以下斷言失敗:.
//預期 : "01-01-10000"
//實際:"01-01- 10000"。
Assertions.assertEquals(
new SimpleDateFormat("dd-MM-yyyy").format(cal.getTime() )。
localDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
);
現在,docs為年份模式規定:
如果字母的數量少于4個(但不是2個),那么根據SignStyle.NORMAL,符號只輸出負數的年份。否則,按照SignStyle.EXCEEDS_PAD的規定,如果超過了墊子的寬度,就會輸出這個符號。
所以這給出了一個提示,但我仍然毫無頭緒:
如何使DateTimeFormatter對Y10K以上的日期輸出與SimpleDateFormat.format()在我的例子中完全相同的字串(=unsigned for positive years >9999)?
uj5u.com熱心網友回復:
ISO 8601確實允許這種年份格式。來自Wikipedia:
為了表示0000之前或9999之后的年份,該標準還允許擴展年份表示,但只有在發送方和接收方之間事先達成協議的情況下才允許。一個擴展的年份表示法[±YYYYY]必須有一個商定的額外的年份數字,超過最小的四位數,而且必須以 或-符號為前綴,而不是更常見的AD/BC(或CE/BCE)符號;
然而,由于它只允許 "通過發送方和接收方之間的事先協議",所以很奇怪,添加符號是LocalDate.toString的默認行為。
根據檔案:
年份。字母的數量決定了最小的欄位寬度,低于這個寬度就會使用填充。如果字母數為2,則使用縮小的2位數形式。對于列印,這將輸出最右邊的兩個數字。對于決議來說,這將使用2000的基值進行決議,結果是2000至2099年(含)范圍內的年份。如果字母的數量少于4個(但不是2個),那么根據
SignStyle.NORMAL,符號只輸出負數的年份。否則,按照SignStyle.EXCEEDS_PAD的規定,如果超過了墊子的寬度,就會輸出該符號。
因此,如果你不想要這個符號,你可以使用3個 "y",或者只使用1個 "y",因為3和1都是 "小于4(但不是2)"。
此外,由于 "y "意味著 "年代的年份",不會有任何負數,所以你也不需要擔心它輸出負數的符號。
示例:
System.out.println(
LocalDate.of(10000, 1, 1)
.format(DateTimeFormatter.ofPattern("dd-MM-yy"/span>))
); //01-10000
一般來說,你可以使用appendValue(TemporalField, int, int, SignStyle)方法在DateTimeFormatterBuilder中指定符號風格。你可以指定SignStyle.NEVER來使它永遠不輸出符號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/332816.html
標籤:
上一篇:屬性錯誤:使用pygooglenews時,'list'物件沒有屬性'strftime'。
下一篇:如何倒數
