4 回答

TA貢獻1856條經驗 獲得超5個贊
這適用于 Java 8 及更高版本:
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendValue(WeekFields.ISO.weekBasedYear(), 4) .appendValue(WeekFields.ISO.weekOfWeekBasedYear(), 2) .parseDefaulting(WeekFields.ISO.dayOfWeek(), DayOfWeek.SUNDAY.getValue()) .toFormatter(); System.out.println(LocalDate.parse("201901", formatter));
輸出是:
2019-01-06
我已經在 Oracle Java 1.8.0_101 上進行了測試。我還沒有安裝任何 IBM Java。
讓它工作的關鍵是使用weekOfWeekBasedYear()
而不是weekOfYear()
. 我的其他變化是裝飾性的。WeekFields.ISO.weekOfYear()
通過計算一年中的星期一來定義周數,這不是您想要的,因為根據 ISO,第 1 周可能從上一年年底(12 月 29 日到 31 日)附近的星期一開始。因此它也不能很好地與基于周的 year一起使用,并且 Java 拒絕將兩者一起使用來標識周。
在 Java 9 上,您的formatter2()
和formatter3()
也都可以工作(在 Oracle Java 9.0.4 上測試過)。Java 8 中似乎存在一個錯誤,相鄰字段解析對YYYYww
. 不過,我已經搜索了 Oracle Java Bug 數據庫,但沒有找到錯誤描述。
國際標準化組織 8601
ISO 8601 是規(guī)定您正在使用的周的定義的標準,它還定義了周的格式。它就像2012-W48
。因此,除非您有充分且非常具體的理由不這樣做,否則這是您應該使用的格式,尤其是在與任何外部系統(tǒng)交換數據時。它還恰好消除了 Java 8 上的相鄰字段解析問題。
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendPattern("YYYY-'W'ww") .parseDefaulting(WeekFields.ISO.dayOfWeek(), DayOfWeek.SUNDAY.getValue()) .toFormatter(); System.out.println(LocalDate.parse("2019-W01", formatter));
2019-01-06

TA貢獻1801條經驗 獲得超16個贊
據我所知你不能那樣做。據我所知,您的代碼有兩個問題。首先是 aLocalDate沒有足夠的信息,因為您的代碼不知道它應該解析到哪個工作日。
二是略顯怪異的字段的使用。如果你只是使用 Chrono 字段,你應該沒問題。您也可以調整您的模式以包含空格或破折號,因為解析似乎不喜歡它在一個數字中 - 不知道為什么
例如,您可以執(zhí)行以下操作:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
? ? ? ? .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER)
? ? ? ? .appendValue(ChronoField.ALIGNED_WEEK_OF_YEAR, 2, 2, SignStyle.NEVER)
? ? ? ? .parseDefaulting(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue())
? ? ? ? .toFormatter();
LocalDate d = LocalDate.parse("201933", formatter);
但是,使用周數似乎不是一個好的選擇。

TA貢獻1831條經驗 獲得超9個贊
您可以使用YearMonth
public?static?void?main(String[]?args)?{ ????System.out.println(YearMonth.parse("201901",?DateTimeFormatter.ofPattern("yyyyMM"))); }
輸出
2019-01

TA貢獻1848條經驗 獲得超10個贊
那么 2019 年的第一周并沒有給你一個特定的日期。您需要添加一周中的特定日期。我跑了這個:
System.out.println(LocalDate.parse("2019-01-01",?DateTimeFormatter.ofPattern("YYYY-ww-ee")));
并得到"2018-12-30"
(那是因為2019年1月1日是星期二,即一周的第三天,所以2019年第一周的第一天實際上是"2018-12-30"
)。請注意,由于某種原因沒有破折號,"-"
它不起作用。
添加回答
舉報