日历错误的一周

问题描述 投票:3回答:4

我有一个日历对象,如下所示代表08 Aug 2014。这是一个星期五。所以myCal.get(Calendar.DAY_OF_WEEK)应该是6.但它给出2.为什么?

java.util.GregorianCalendar[time=1410177767000,areFieldsSet=true,lenient=true,zone=Asia/Calcutta,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=8,WEEK_OF_YEAR=37,WEEK_OF_MONTH=2,DAY_OF_MONTH=8,DAY_OF_YEAR=251,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=32,SECOND=47,MILLISECOND=0,ZONE_OFFSET=19800000,DST_OFFSET=0]
java date calendar dayofweek
4个回答
11
投票

我有一个日历对象,如下所示,代表2014年8月8日。

它不是:MONTH=8是九月,而不是八月(月份编号从零开始)。

您可以通过在输出中注明DAY_OF_YEAR=251来验证自己。 The 251st day of a non-leap year is 8 September

另一种检查时间戳的方法是将1410177767000粘贴到http://www.epochconverter.com/


3
投票

GregorianCalender将八月份视为“7”而不是“8”,因为1月份被表示为“0”。参考:Gregorian Calendar

请仔细检查以下内容,它应该有效。

   import java.util.*;

   public class Test {
       public static void main(String args[]) {
           GregorianCalendar myCal = new GregorianCalendar(2014, 7, 8);
           System.out.println(myCal.get(Calendar.DAY_OF_WEEK));
       }
   }

0
投票

正如我们的朋友所说,计数从0开始。因此,1月是0月。

如果你来到这里可能已经完成了代码。为了避免代码中的评论,您可以执行以下操作:

currentDateMonth = calendar.get(Calendar.MONTH);

currentDateMonth = currentDateMonth+1; 

0
投票

tl;dr

使用java.time类而不是可怕的遗留日期时间类及其疯狂的月份编号。

LocalDate.of( 2014 , Month.AUGUST , 8 )
.getDayOfWeek()
.equals( DayOfWeek.FRIDAY )

真正

java.time

您正在使用java.time类几年前取代的糟糕的应用程序旧日期时间类。

Sane编号

LocalDate表示仅日期值。请注意理智的编号,与传统类别不同:2014表示2014年,1至12月表示1月至12月。所以你无意中使用错误的月份的问题没有实际意义,如果你一直在使用现代的,设计良好的java.time类,那就永远不会发生。

LocalDate ld = LocalDate.of( 2014 , Month.AUGUST , 8 ) ;

请求代表该日期的星期几的DayOfWeek枚举对象。

DayOfWeek dow = ld.getDayOfWeek() ;

兑换

如果你手头有一个GregorianCalendar对象,旧代码尚未更新到java.time,请转换。转换为ZonedDateTime。然后提取DayOfWeek

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
DayOfWeek dow = zdt.getDayOfWeek() ;
© www.soinside.com 2019 - 2024. All rights reserved.