Java 为什么一周中的第十一天增加了一天?

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_

为什么一周中的第十一天会多加一天?它应该在星期天回来,但现在是星期一

我已经在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_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类取代的糟糕的旧日期时间类
  • 你含蓄地引入了时区问题,而没有正面解决它们。时区对于感知日期(和一周中的某一天)至关重要
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)