第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法從基于周的字符串的 TemporalAccessor 獲取 LocalDate

無法從基于周的字符串的 TemporalAccessor 獲取 LocalDate

偶然的你 2023-06-04 15:02:09
我正在嘗試將格式為“YYYYww”(例如 201901)的簡單字符串解析為 LocalDate,但我的嘗試都沒有成功。我試圖通過簡單地使用模式“YYYYww”以及通過手動將值附加到 FormatterBuilder 來解析它。由于我的輸入字符串不包含一天,我還將格式化程序配置為默認為星期日。這是對我來說失敗的代碼,運行 Java 8 (IBM JRE 8.0.5.25)。    formatter1(); // Unable to obtain LocalDate from TemporalAccessor    formatter2(); // Text '201901' could not be parsed at index 0    formatter3(); // Text '201901' could not be parsed at index 6}public static void formatter1() {    DateTimeFormatter formatter = new DateTimeFormatterBuilder()            .appendValue(WeekFields.ISO.weekBasedYear(), 4, 4, SignStyle.NEVER)            .appendValue(WeekFields.ISO.weekOfYear(), 2, 2, SignStyle.NEVER)            .parseDefaulting(WeekFields.ISO.dayOfWeek(), DayOfWeek.SUNDAY.getValue())            .toFormatter();    LocalDate.parse("201901", formatter);}public static void formatter2() {    DateTimeFormatter formatter = new DateTimeFormatterBuilder()            .appendPattern("YYYYww")            .parseDefaulting(WeekFields.ISO.dayOfWeek(), DayOfWeek.SUNDAY.getValue())            .toFormatter();    LocalDate.parse("201901", formatter);}public static void formatter3() {    DateTimeFormatter formatter = new DateTimeFormatterBuilder()            .parseLenient()            .appendPattern("YYYYww")            .parseDefaulting(WeekFields.ISO.dayOfWeek(), DayOfWeek.SUNDAY.getValue())            .toFormatter();    LocalDate.parse("201901", formatter);}如示例代碼中所示,我收到不同的錯誤消息,尤其是第一個示例讓我感到困惑,因為 TemporalAccessor 包含基于周的年份、一年中的星期和工作日,這應該足以構造 LocalDate .
查看完整描述

4 回答

?
RISEBY

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

查看完整回答
反對 回復 2023-06-04
?
侃侃爾雅

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);

但是,使用周數似乎不是一個好的選擇。

查看完整回答
反對 回復 2023-06-04
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

您可以使用YearMonth

public?static?void?main(String[]?args)?{
????System.out.println(YearMonth.parse("201901",?DateTimeFormatter.ofPattern("yyyyMM")));
}

輸出

2019-01


查看完整回答
反對 回復 2023-06-04
?
慕桂英546537

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")。請注意,由于某種原因沒有破折號,"-"它不起作用。

查看完整回答
反對 回復 2023-06-04
  • 4 回答
  • 0 關注
  • 406 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號