gpt4 book ai didi

java - 为什么 DAY_OF_WEEK 多加一天?

转载 作者:行者123 更新时间:2023-11-29 23:06:07 25 4
gpt4 key购买 nike

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(1560049200);

cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY // this returns true

cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) // Outputs Monday instead of Sunday.

为什么 DAY_OF_WEEK 多加一天?它应该在星期天返回,但它会在星期一返回。

我已经在我的 Android 设备和 Android 模拟器上的 I/System.out 中对此进行了测试。 cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY 不断返回 true

-编辑-

我也试过:

Date date = new Date(1560049200);
date.getDay();

这将返回 1

最佳答案

tl;dr

Instant                          // Represent a moment in UTC.
.ofEpochSecond( // Parse a count of whole seconds since 1970-01-01T00:00Z.
1_560_049_200L // Contemporary moments are about a billion and a half seconds since 1970-01-01T00:00Z.
) // Returns a `Instant` object.
.atZone( // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
Zone.of( "Africa/Tunis" ) // Specify the time zone in which you are interested.
) // Returns a `ZonedDateTime` object.
.getDayOfWeek() // Returns one of the seven pre-defined enum objects, one for each day of the week, Monday-Sunday. Returns a `DayOfWeek` object.
.getDisplayName( // Localize the presentation of the name of the day of the week.
TextStyle.FULL , // Specify how long or abbreviated should the name of the day of week be.
new Locale ( "fr" , "TN" ) // Specify the human language and cultural norms to use in translating the name of the day of week.
) // Returns a `String` object.

samedi

问题

  • 您的输入显然是整秒数,而不是milliseconds .
  • 您使用的是多年前被现代 java.time 类取代的可怕的旧日期时间类。
  • 您隐含地引入了时区问题,而没有正面解决这些问题。时区对于感知日期(和星期几)至关重要。

java.time

您输入的数字 1_560_049_200L 显然是自 1970 年第一刻以来的整秒计数(UTC)。您的代码错误地将它们解析为毫秒数。

解析为 Instant

Instant instan = Instant.ofEpochSecond( 1_560_049_200L ) ;

instant.toString(): 2019-06-09T03:00:00Z

调整到您想要感知日期的时区,从而适应星期几。

指定 proper time zone name格式为Continent/Region,例如America/MontrealAfrica/Cas​​ablancaPacific/Auckland .切勿使用 2-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

zdt.toString(): 2019-06-08T23:00-04:00[America/Montreal]

请注意日期上的差异:UTC 中的 9 日与魁北克的 8 日。请记住:对于任何给定时刻,日期在全局范围内因地区而异。在东方是“明天”,在西方还是“昨天”。

不同的日期意味着不同的星期几。 在魁北克是星期六,同时在法国巴黎也是星期日。这就是指定时区至关重要的原因。

提取星期几。

DayOfWeek dow = zdt.getDayOfWeek() ;

dow.toString(): SATURDAY

本地化星期几的名称。

String output = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );

samedi

或者,Locale.US 代表美国。

String output = dow.getDisplayName( TextStyle.FULL , Locale.US );

Saturday

Table of date-time types in Java, both modern and legacy

关于java - 为什么 DAY_OF_WEEK 多加一天?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56511126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com