Java 为什么一周中的第十一天增加了一天?
为什么一周中的第十一天会多加一天?它应该在星期天回来,但现在是星期一 我已经在I/System.out、我的Android设备和Android Emulator上对此进行了测试Java 为什么一周中的第十一天增加了一天?,java,android,android-calendar,Java,Android,Android Calendar,为什么一周中的第十一天会多加一天?它应该在星期天回来,但现在是星期一 我已经在I/System.out、我的Android设备和Android Emulator上对此进行了测试cal.get(Calendar.DAY OF_WEEK)=Calendar.MONDAY不断返回true -编辑- 我还尝试: Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(1560049200); cal.get(Calendar.DAY_OF_
cal.get(Calendar.DAY OF_WEEK)=Calendar.MONDAY
不断返回true
-编辑-
我还尝试:
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.
这是返回1
tl;博士
萨梅迪
问题
- 您的输入显然是整秒的计数,而不是
- 您使用的是几年前被现代java.time类取代的糟糕的旧日期时间类李>
- 你含蓄地引入了时区问题,而没有正面解决它们。时区对于感知日期(和一周中的某一天)至关重要
1_560_049_200L
显然是自UTC 1970年第一刻以来的整秒计数。您的代码错误地将它们解析为毫秒计数
解析为一个即时
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.
instant.toString():2019-06-09T03:00:00Z
调整到您想要感知日期的时区,从而感知一周中的某一天
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
DayOfWeek dow = zdt.getDayOfWeek() ;
以大陆/地区
的格式指定,例如美国/蒙特利尔
,非洲/卡萨布兰卡
,或太平洋/奥克兰
。切勿使用2-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
zdt.toString():2019-06-08T23:00-04:00[美国/蒙特利尔]
请注意日期上的差异:UTC的第9次与魁北克的第8次。请记住:在任何一个特定的时刻,全球各地的日期因地区而异。在东方,它是“明天”,而在西方,它仍然是“昨天”
不同的日期意味着一周中不同的一天。魁北克省的星期六,法国巴黎的星期天。这就是为什么指定时区至关重要的原因
提取一周中的某一天
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
DayOfWeek dow = zdt.getDayOfWeek() ;
道琼斯指数:星期六
本地化一周中某一天的名称
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
DayOfWeek dow = zdt.getDayOfWeek() ;
萨梅迪
或者,对于美国,Locale.US
String output = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
星期六
cal.get(Calendar.DAY\u OF\u WEEK)=Calendar.MONDAY
为我返回false并输出Sunday。这很奇怪。对我来说,无论是在I/System.out还是在我的Android设备上,它都返回true。也许你需要在getInstance方法中设置区域设置,例如Calendar cal=Calendar.getInstance(Locale.US)代码>我不是日历专家,所以我只是在猜测。@JamesKPolk它仍然为我返回true
。我通过执行以下操作解决了这个问题:cal.setTimeInMillis((长)1560049200*1000)代码>