【问题标题】:Calendar returns wrong month and year Java日历返回错误的月份和年份 Java
【发布时间】:2014-10-06 00:25:21
【问题描述】:
    Calendar now = null;
    now.getInstance();
    System.out.println(now.getInstance());
    System.out.println(now.ERA);
    System.out.println(now.YEAR);
    System.out.println(now.MONTH);
    System.out.println(now.WEEK_OF_YEAR);
    System.out.println(now.WEEK_OF_MONTH);
    System.out.println(now.DAY_OF_MONTH);
    System.out.println(now.DAY_OF_YEAR);
    System.out.println(now.DAY_OF_WEEK);
    System.out.println(now.DAY_OF_WEEK_IN_MONTH);

程序输出(重要信息在大写和新行中):

java.util.GregorianCalendar[time=1412554865330,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=9,WEEK_OF_YEAR=41,WEEK_OF_MONTH=2,DAY_OF_MONTH=5,DAY_OF_YEAR=278,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=21,SECOND=5,MILLISECOND=330,ZONE_OFFSET=-28800000,DST_OFFSET=3600000]

0
1
2
3
4
5
6
7
8

(0-8 换行) 我真的很迷茫,不知道为什么 java 决定对我玩这个可怕的恶作剧。

【问题讨论】:

标签: java date calendar


【解决方案1】:

这些都是来自Calendar 类的static 字段。 Java allows static fields (and methods) to be accessed on expressions that resolve to an instance's reference value 与类型名称相同

now.ERA
// is equivalent to
Calendar.ERA

Calendar 类提供了一个get(int) 方法来获取日期字段的值。

now.get(Calendar.MONTH);

【讨论】:

  • 我尝试了多种编写方法,包括 Calendar.getInstance().MONTH()。但是,您建议的方式会导致 NullPointerException。现在日历 = null; now.get(日历.MONTH);因为 now 为 null 但必须初始化才能使用它的方法。
  • @DavidFisher 我已经链接了 javadoc。不要只是猜测。查看可用的方法并使用它们。我已经提供了一个从 Calendar 实例中获取 Month 字段的示例。
  • @DavidFisher 在调用方法之前初始化您的引用。
  • 我是个白痴。现在由 Calendar 初始化 = Calendar.getInstance();感谢您的帮助。
【解决方案2】:

乔达时间

仅供参考,您可能会发现使用 Joda-Time 库(或 Java 8 中的 java.time package)比使用 java.util.Date 和 java.util.Calendar 类更愉快。

Joda-Time 和 java.time 都遵循 ISO 8601 定义一年中的一周和默认字符串格式。

这是相同类型的代码,但使用的是Joda-Time 2.4。

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
java.util.Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter formatter = DateTimeFormat.forStyle( "FF" ).withLocale( locale );
DateTime dateTime = DateTime.now( timeZone );

转储到控制台。

System.out.println( "Full: " + formatter.print( dateTime ) );
System.out.println( "Era: " + dateTime.getEra() ); // 0 (BC/BCE) & 1 (AD/CE).
System.out.println( "Year: " + dateTime.getYear() );
System.out.println( "Month: " + dateTime.getMonthOfYear() );
System.out.println( "WeekOfYear: " + dateTime.getWeekOfWeekyear() ); // Standard ISO 8601 week.
//System.out.println( now.WEEK_OF_MONTH ); // Not in Joda-Time as there is no standard definition for week-of-month.
System.out.println( "DayOfMonth: " + dateTime.getDayOfMonth() );
System.out.println( "DayOfYear: " + dateTime.getDayOfYear() );
System.out.println( "DayOfWeek: " + dateTime.getDayOfWeek() ); // Starts at 1 rather than 0. Amazing!
//System.out.println( now.DAY_OF_WEEK_IN_MONTH ); // Not in Joda-Time as there is no standard definition for week-of-month.
System.out.println( "TimeZone: " + dateTime.getZone() );

运行时。

Full: dimanche 5 octobre 2014 21 h 22 EDT
Era: 1
Year: 2014
Month: 10
WeekOfYear: 40
DayOfMonth: 5
DayOfYear: 278
DayOfWeek: 7
TimeZone: America/Montreal

【讨论】:

    【解决方案3】:

    如果可以移植到 Java8,我推荐 Java8 的 LocalDateTime 和 LocalTime 类

    否则我建议使用GregorianCalendar cal = new GregorianCalendar()

    cal.get(Calendar.MONTH) for example
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2013-03-14
      相关资源
      最近更新 更多