【问题标题】:Calendar giving wrong day of week日历给出错误的星期几
【发布时间】:2014-11-15 09:05:39
【问题描述】:

我有一个如下的日历对象,它代表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


    【解决方案1】:

    我有一个日历对象,如下所示,代表 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+ 这就是为什么不应该使用幻数,而应该使用诸如 Month.AUGUST 之类的常量。
    • 天啊。根据我的错误假设,我一直在调试我的代码。
    【解决方案2】:

    GregorianCalender 将 8 月的月份设为“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));
           }
       }
    

    【讨论】:

      【解决方案3】:

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

      如果您来到这里,您可能已经完成了代码。为了避免代码审查,您可以这样做:

      currentDateMonth = calendar.get(Calendar.MONTH);
      
      currentDateMonth = currentDateMonth+1; 
      

      【讨论】:

        【解决方案4】:

        tl;博士

        使用 java.time 类而不是带有疯狂月份编号的糟糕的旧日期时间类。

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

        是的

        java.time

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

        合理的编号

        LocalDate 表示仅日期值。请注意合理的编号,与传统类不同:2014 表示 2014 年,月份 1-12 表示 1 月至 12 月。因此,您无意中使用错误月份的问题是没有实际意义的,如果您一直在使用现代且设计良好的 java.time 类,则永远不会发生这种情况。

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

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

        DayOfWeek dow = ld.getDayOfWeek() ;
        

        转换

        如果您手头有一个由尚未更新为 java.time 的旧代码提供的 GregorianCalendar 对象,请转换。转换为ZonedDateTime。然后解压DayOfWeek

        ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
        DayOfWeek dow = zdt.getDayOfWeek() ;
        

        【讨论】:

          猜你喜欢
          • 2017-12-10
          • 2019-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-23
          • 1970-01-01
          • 2021-06-29
          • 2014-10-29
          相关资源
          最近更新 更多