Y возвращает 2012, а y возвращает 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 

Может ли кто-нибудь объяснить, почему?

недельный год и год. Из javadoc

Недельный год синхронизируется с циклом WEEK_OF_YEAR. Все недели между первой и последней неделями (включительно) имеют одинаковое значение за неделю. Таким образом, первый и последний дни недели могут иметь разные значения календарного года.

Например, 1 января 1998 года – четверг. Если getFirstDayOfWeek () является MONDAY, а 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.

Новый код обрабатывается в classе WeekFields и, в частности, в нижнем регистре y / верхний регистр Y с помощью weekBasedYear() поля weekBasedYear() .

Возвращает поле для доступа к году недели в зависимости от этого WeekFields. Это представляет собой концепцию года, когда недели начинаются с фиксированного дня недели, например, в понедельник и каждую неделю – ровно один год. Это поле обычно используется с dayOfWeek () и weekOfWeekBasedYear ().

Неделя 1 (1) – это неделя, начинающаяся с getFirstDayOfWeek (), где есть как минимум getMinimalDaysInFirstWeek () дней в году. Таким образом, первая неделя может начаться до начала года. Если первая неделя начинается после начала года, то период, предшествующий предыдущей, находится на последней неделе предыдущего года.

Это поле можно использовать с любой системой календаря.

На этапе разрешения парсинга можно создать дату с недели по неделям, неделям и дням недели.

В строгом режиме все три поля проверяются относительно диапазона допустимых значений. Поле недели за неделю проверяется, чтобы гарантировать, что итоговый недельный год будет запрошен в течение недели.

В интеллектуальном режиме все три поля проверяются относительно диапазона допустимых значений. Поле недели недели по неделям проверяется от 1 до 53, что означает, что итоговая дата может быть указана в следующем недельном году.

В мягком режиме год и день недели проверяются на диапазон допустимых значений. Полученная дата рассчитывается эквивалентно следующему трехэтапному подходу. Сначала создайте дату в первый день первой недели в запрошенном недельном году. Затем возьмите неделю недели по году, вычтите один и добавьте сумму за несколько недель до даты. Наконец, приспосабливайтесь к правильному дню недели в пределах локализованной недели.

Настройка этого экземпляра WeekFields зависит от локали и может иметь разные настройки в зависимости от этого, страны США и Европы, такие как Франция, могут иметь другой день в начале недели.

Например, DateFormatterBuilder из Java 8, DateFormatterBuilder парсер с DateFormatterBuilder и используйте этот язык для символа 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 и т. Д.), -Duser.language= принудительно установить языковой стандарт во время вызова:

 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))); 

Формат Y чтобы получить неделю, если неделя поддержки календаря. ( getCalendar().isWeekDateSupported() )

Я усердно изучил format:date библиотеки тегов JSTL format:date с short как запрошенный формат использует YYYY под обложками. Который действительно может отпечатать печатную дату в год.

  • Как преобразовать String в Date с помощью SimpleDateFormat?
  • Java SimpleDateFormat всегда возвращает январь за месяц
  • Как вы форматируете день месяца, чтобы сказать «11-й», «21-й» или «23-й» (порядковый индикатор)?
  • Сравнение времени неверно при выборе 12:00
  • Анализ порядкового индикатора даты (st, nd, rd, th) в строке даты
  • java.text.ParseException: Непревзойденная дата
  • Почему SimpleDateFormat Java не является streamобезопасным?
  • Исключение синтаксиса формата даты - «EEE MMM dd HH: mm: ss Z yyyy»
  • Как анализировать дату с GMT TimeZone на IST TimeZone и наоборот в android
  • Как конвертировать дату в формат yyyy-MM-dd?
  • Изменение формата даты строки
  • Interesting Posts

    Как принять массив в качестве параметра действия controllerа ASP.NET MVC?

    CS0120: Ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’

    Почему редактор Visual Studio показывает точки в пустых местах?

    Internet Explorer 11 не добавляет заголовок Origin в запросе CORS?

    Сделайте снимок экрана веб-страницы на Java

    VBA Runtime Error 1004 «Определенная пользователем или объектная ошибка» при выборе диапазона

    Как программно выбрать элемент в WPF TreeView?

    Как программно копировать текст в приложении для Android?

    Как получить доступ к папкам Windows из Bash на Ubuntu в Windows

    Почему C-массив имеет неправильное значение sizeof (), когда он передается функции?

    Как вы поворачиваете двухмерный массив?

    Увеличение размера виртуального диска

    Программно импортировать сертификат доверия CA в существующий файл хранилища ключей без использования keytool

    В чем смысл «UseTaskFriendlySynchronizationContext»?

    Почему драйвер JDBC должен быть помещен в папку TOMCAT_HOME / lib?

    Давайте будем гением компьютера.