2014-10-06 9 views
0
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

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 находятся на новых линиях) Я действительно потеря здесь и я не уверен, почему я решил сыграть эту ужасную шалость со мной.

+1

чем проблема, собственно? Что вы видите, чего не ожидаете? Возможно, значение MONTH? [* Первый месяц года в григорианском и юлианском календарях - ЯНВАРЬ, который равен 0; последнее зависит от количества месяцев в году.) *] (http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#MONTH) –

+1

О, я вижу, что ваша проблема есть. Попробуйте 'System.out.println (now.get (Calendar.YEAR));'. Кроме того, «Календарь сейчас = Calendar.getInstance();». –

ответ

3

Все это static Поля из Calendar класс. 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); 
+0

Я пробовал несколько способов записи, включая Calendar.getInstance(). MONTH(). Однако способ, который вы предложили, вызывает исключение NullPointerException. Calendar now = null; now.get (Calendar.MONTH); потому что теперь имеет значение null, но должен быть инициализирован для использования его методов. –

+1

@DavidFisher Я связал javadoc. Не просто догадаться. Посмотрите доступные методы и используйте их. Я уже привел один пример получения поля Month из экземпляра «Calendar». –

+0

@DavidFisher Инициализируйте свою ссылку, прежде чем вы вызовете на ней метод. –

0

Joda времени

Просто FYI, вы можете найти работу с Joda-Time библиотеки (или java.time package в Java 8), чтобы быть более приятным, чем при использовании 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 
-1

Я рекомендую LocalDateTime и МестноеВремя классы Java8 если вы можете порт в Java8

В противном случае я бы рекомендовал использовать GregorianCalendar cal = new GregorianCalendar()

cal.get(Calendar.MONTH) for example