Г 2012 г 2011 возвращает, а возвращает В класса simpledateformat
интересно, почему ' Y 'возвращает 2012, а' y ' возвращает 2011 в SimpleDateFormat
:
System.out.println(new SimpleDateFormat("Y").format(new Date())); // prints 2012
System.out.println(new SimpleDateFormat("y").format(new Date())); // prints 2011
может кто-нибудь объяснить, почему?
4 ответа:
недели и год. Из javadoc
неделя год синхронизируется с циклом WEEK_OF_YEAR. Все недели между ними первая и последняя недели (включительно) имеют одинаковое значение недели года. Таким образом, первый и последний дни недели могут быть разные значения календарного года.
например, 1 января 1998 года, в четверг. Если getFirstDayOfWeek() является Понедельник и getMinimalDaysInFirstWeek () - это 4 (стандарт ISO 8601 совместимая настройка), затем неделя 1 1998 года начинается 29 декабря 1997 года, и заканчивается 4 января 1998 года. Неделя год 1998 для последних трех дни календарного 1997 года. Если, однако, getFirstDayOfWeek() является Воскресенье, затем неделя 1 1998 года начинается 4 января 1998 года и заканчивается 10 января 1998 года; первые три дня 1998 года тогда являются частью Недели 53 из 1997 и их недельный год 1997.
вот обновление Java 8 с некоторым кодом, так как GregorianCalendar, вероятно, будет устаревшим или удаленным из будущих версий JDK.
новый код обрабатывается в
WeekFields
класс, и специально для нижнего регистраy
/ верхний регистрY
СweekBasedYear()
полей доступа.возвращает поле для доступа к Году недели на основе этого Уикфилд. Это представляет собой концепцию года, где начинаются недели на фиксированный день недели, такой как понедельник и каждая неделя принадлежит ровно один год. Это поле обычно используется с dayOfWeek () и weekOfWeekBasedYear ().
Неделя первая(1) - Это неделя, начинающаяся с getFirstDayOfWeek () где есть по крайней мере getMinimalDaysInFirstWeek() дней в году. таким образом, первая неделя может начаться до начала года. Если первая неделя начинается после начала года, то период до этого находится в последняя неделя предыдущего год.
это поле можно использовать с любой календарной системой.
на этапе разрешения синтаксического анализа можно создать дату из неделя на основе года, неделя года и день недели.
в строгом режиме, все три поля проверяются на их выбор действительное значение. Поле неделя года проверяется для обеспечения того, чтобы результирующий недельный год-это запрошенный недельный год.
в интеллектуальном режиме, все три поля проверяются по их диапазону действительное значение. Поле неделя недели на основе года проверяется от 1 до 53, что означает, что результирующая дата может быть в следующем неделя базируемый год по сравнению с указанным.
в мягком режиме, год и день недели утверждены против диапазон допустимых значений. Полученная дата вычисляется эквивалентно следующие три этапа. Во-первых, создайте дату на первом день первой недели в запрашиваемой неделя на основе года. Тогда возьмите неделя недели на основе года, вычесть один и добавить сумму в неделях, чтобы дата. И, наконец, отрегулируйте правильный день недели в локализованная неделя.
установка
наWeekFields
экземпляр зависит от локали и может иметь разные настройки в зависимости от него, США и европейские страны, такие как Франция, могут иметь другой день в начале недели.DateFormatterBuilder
в Java 8, создания парсера с язык, и использовать этот язык дляY
символ :public final class DateTimeFormatterBuilder { ... private void parsePattern(String pattern) { ... } else if (cur == 'Y') { // Fields defined by Locale appendInternal(new WeekBasedFieldPrinterParser(cur, count)); } else { ... static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser { ... /** * Gets the printerParser to use based on the field and the locale. * * @param locale the locale to use, not null * @return the formatter, not null * @throws IllegalArgumentException if the formatter cannot be found */ private DateTimePrinterParser printerParser(Locale locale) { WeekFields weekDef = WeekFields.of(locale); TemporalField field = null; switch (chr) { case 'Y': field = weekDef.weekBasedYear(); if (count == 2) { return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE, 0); } else { return new NumberPrinterParser(field, count, 19, (count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, -1); } case 'e': case 'c': field = weekDef.dayOfWeek(); break; case 'w': field = weekDef.weekOfWeekBasedYear(); break; case 'W': field = weekDef.weekOfMonth(); break; default: throw new IllegalStateException("unreachable"); } return new NumberPrinterParser(field, (count == 2 ? 2 : 1), 2, SignStyle.NOT_NEGATIVE); } ... } ... }
вот пример
System.out.format("Conundrum : %s%n", ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")) .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'"))); System.out.format("Solution : %s%n", ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")) .format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmms'S'"))); System.out.format("JVM Locale first day of week : %s%n", WeekFields.of(Locale.getDefault()).getFirstDayOfWeek()); System.out.format("US first day of week : %s%n", WeekFields.of(Locale.US).getFirstDayOfWeek()); System.out.format("France first day of week : %s%n", WeekFields.of(Locale.FRANCE).getFirstDayOfWeek()); System.out.format("JVM Locale min days in 1st week : %s%n", WeekFields.of(Locale.getDefault()).getMinimalDaysInFirstWeek()); System.out.format("US min days in 1st week : %s%n", WeekFields.of(Locale.US).getMinimalDaysInFirstWeek()); System.out.format("JVM Locale min days in 1st week : %s%n", WeekFields.of(Locale.FRANCE).getMinimalDaysInFirstWeek()); System.out.format("JVM Locale week based year (big Y): %s%n", ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear())); System.out.format("France week based year (big Y) : %s%n", ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear())); System.out.format("US week based year (big Y) : %s%n", ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.US).weekBasedYear()));
и в отношении локали и верхнего регистра
Y
, вы можете либо играть с опцией командной строки-Duser.language=
(fr
,en
,es
и т. д.), или заставить локаль во время вызова :System.out.format("English localized : %s%n", ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")) .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.ENGLISH))); System.out.format("French localized : %s%n", ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")) .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.FRENCH)));