日历错误的一周

时间:2014-09-21 06:26:25

标签: java date calendar dayofweek

我有一个代表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]

4 个答案:

答案 0 :(得分:11)

  

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

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

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

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

答案 1 :(得分:3)

格里高利历月需要一个月的八月份,因为' 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));
       }
   }

答案 2 :(得分:0)

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

如果您来到这里,您可能已经完成了代码。为了避免对代码进行审查,您可以执行以下操作:

currentDateMonth = calendar.get(Calendar.MONTH);

currentDateMonth = currentDateMonth+1; 

答案 3 :(得分:0)

tl; dr

使用 java.time 类,而不要使用带有疯狂月份编号的可怕的旧式日期时间类。

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

true

java.time

您使用的是可怕的应用程序旧日期时间类,而这些类早已被 java.time 类取代。

理智编号

LocalDate代表仅日期的值。请注意,与传统类不同,编号是合理的:2014表示2014年,而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() ;