System.out.println(
DateTimeFormatter.ofPattern("YYYY-ww").withZone(ZoneOffset.UTC).format(Instant.parse("2022-05-10T00:00:00.00Z"))
);
System.out.println(
DateTimeFormatter.ofPattern("YYYY-ww").withZone(ZoneOffset.UTC).format(Instant.parse("2022-05-17T00:00:00.00Z"))
);
為什么這種模式YYYY-ww
在 Ubuntu 和 Mac 上的決議方式不同:
Ubuntu:(默認語言環境 en_US,我的電腦)
2022-20
2022-21
Mac:(默認語言環境 en_GB)
2022-19
2022-20
編輯
System.out.println(
DateTimeFormatter.ofPattern("YYYY-ww").withLocale(Locale.UK).withZone(ZoneOffset.UTC).format(Instant.parse("2022-05-10T00:00:00.00Z"))
);
System.out.println(
DateTimeFormatter.ofPattern("YYYY-ww").withLocale(Locale.UK).withZone(ZoneOffset.UTC).format(Instant.parse("2022-05-17T00:00:00.00Z"))
);
回傳:
2022-19
2022-20
不過,問題是為什么模式ww
是特定于語言環境的?我在https://docs.oracle.com/javase/8/docs/api/java/time/temporal/WeekFields.html
或https://docs.oracle.com/javase/8的檔案中看不到這一點/docs/api/java/time/format/DateTimeFormatter.html
uj5u.com熱心網友回復:
在美國地區,一年的第一周可以有 1 到 7 天,而在英國,一年的第一周至少需要 4 天。
WeekFields.of(Locale.UK).getMinimalDaysInFirstWeek() // 4
WeekFields.of(Locale.US).getMinimalDaysInFirstWeek() // 1
此外,美國的一周從星期日開始,而英國的一周從星期一開始。
這意味著對于美國來說,2022 年的第一周是 2022-01-01 的單個星期六,而 2022-01-02 是第二周的開始。另一方面,對于英國來說,2022 年的第一周從 2022 年 1 月 3 日開始,因為一年中的前兩天不構成一周。這就是美國機器額外一周的來源。
創建DateTimeFormatter
usingofPattern
時,使用機器的默認格式化語言環境:
格式化程式將使用默認的 FORMAT 語言環境。這可以使用
withLocale(Locale)
回傳的格式化程式進行更改
因此差異。
我想你在這里想要標準的ISO 8601 周,而不想要與語言環境有任何關系。一種方法是構造一個DateTimeFormatter
using IsoFields
:
var dtf = new DateTimeFormatterBuilder()
. appendValue(IsoFields.WEEK_BASED_YEAR, 4)
.appendLiteral('-')
.appendValue(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 2)
.toFormatter().withZone(ZoneOffset.UTC);
System.out.println(
dtf.format(Instant.parse("2022-05-10T00:00:00.00Z"))
);
System.out.println(
dtf.format(Instant.parse("2022-05-17T00:00:00.00Z"))
);
uj5u.com熱心網友回復:
“星期”的定義因地區而異
Sweeper的答案是正確的。一周有幾種定義,它們因地區而異。
您問:
不過,問題是為什么模式 ww 是特定于語言環境的?
因為周的定義是文化的。
甚至將我們的范圍限制在西方目前常見的每周 7 天,這 7 天中的哪一天是一周的第一天?星期一在歐洲????很常見,而美國???? 使用星期日。第 1 周應該從一周的第一天的第一次出現開始嗎?還是應該從 1 月 1 日開始一周?
ISO 8601 標準
如果您想要一致性,請考慮使用標準ISO 8601 周定義:
- 星期一是一周的第一天,最后是星期日。
- 第 1 周包含日歷年的第一個星期四。
- 以周為基礎的一年有 52 或 53 個完整的 7 天周。
- 從上一個/下一個日歷年開始,第一周和最后一周可能分別有零天或多天。
標準格式是四位數的年份、連字符、aW
和兩位數的星期數。標準格式經過巧妙設計,可避免歧義,易于機器決議,并且跨文化的人類都可以理解。
要使用 ISO 8601 周,我建議將ThreeTen-Extra庫添加到您的專案中作為它的YearWeek
類。
YearWeek yw = YearWeek.parse( "2022-W19" ) ;
String output = yw.toString() ;
按日期獲取年周。
LocalDate ld = LocalDate.parse( "2022-05-10" ) ;
YearWeek yw = YearWeek.from( ld ) ;
從標準 ISO 8601 格式的文本表示的 UTC 時刻獲取年周。下面Z
看到的末尾表示與 UTC 的偏移量為零時分秒,發音為“Zulu”。
String input = "2022-05-10T00:00:00.00Z" ;
Instant instant = Instant.parse( input ) ;
OffsetDateTime odt = instant.at( ZoneOffset.UTC ) ;
YearWeek yw = YearWeek.from( odt ) ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484081.html
上一篇:PHP檢查2次betwen2次