IT

Y는 2012를 반환하고 y는 SimpleDateFormat 2011을 반환한다.

itgroup 2023. 1. 12. 22:11
반응형

Y는 2012를 반환하고 y는 SimpleDateFormat 2011을 반환한다.

'Y'는 2012년, 'Y'는 2011년, '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에서

1주일 연도는 1주일_과 동기화됩니다.OF_YEAR 사이클.첫 번째 주와 마지막 주 사이의 모든 주(포함)의 연도 값은 동일합니다.따라서 한 해의 번째 요일과 마지막 요일은 다른 달력 연도 값을 가질있습니다.

예를 들어 1998년 1월 1일은 목요일입니다.getFirstDayOfWeek()가 MONDAY, getMinimalDaysInFirstWeek()가 4(ISO 8601 표준 호환 설정)인 경우 1998년 1월1주는 1997년 12월 29일에 시작하여 1998년 1월4일에 종료됩니다.1997년의 마지막 3일은 1998년이다.단, getFirstDayOfWeek()가 SUNDAY일 경우 1998년1월 4일에 시작하여 1998년1월 10일에 종료됩니다.98년의 첫 3일은 1997년의 53번째 주에 속하며 그 해는 1997년입니다.

GregorianCalendar는 향후 JDK 버전에서 폐지되거나 삭제될 수 있으므로 Java 8 업데이트에 몇 가지 코드가 포함되어 있습니다.

새로운 코드는WeekFieldsclass, 특히 소문자의 경우y/ 대문자Y필드 액세스자와 함께 합니다.

이 WeekFields를 기반으로 한 주 단위 연도에 액세스할 필드를 반환합니다.이는 월요일과 같은 고정된 요일에 시작하는 주가 있고 각 주가 정확히 1년에 속하는 해의 개념을 나타냅니다.이 필드는 보통 dayOfWeek() 및 weekOfWeekBasedYear()와 함께 사용됩니다.

첫 번째 주(1)는 getFirstDayOfWeek()에서 시작하는 주입니다.여기서 1년 중 적어도 getMinimalDaysInFirstWeek()일이 있습니다.따라서 첫 번째 주가 한 해가 시작되기 전에 시작될 수 있습니다. 연도가 시작된 후 첫 주가 시작되는 경우, 그 이전 기간은 전년의 마지막 주가 됩니다.

이 필드는 모든 일정관리 시스템에서 사용할 수 있습니다.

해석의 해결 단계에서는 날짜를 주 단위 연도, 주 단위 및 요일로 작성할 수 있습니다.

strict 모드에서는 3개의 필드 모두 유효한 값의 범위와 대조하여 검증됩니다.Week-of-Year 필드가 검증되어 결과적인 Week-Based Year가 요청된 Week-Based Year가 되도록 합니다.

스마트 모드에서는 3개의 필드 모두 유효한 값의 범위에 대해 검증됩니다.week-of-week-based-year 필드의 유효기간은 1 ~53 입니다.즉, 결과 날짜는 지정된 다음 주부터 다음 주까지입니다.

관대한 모드에서는 year 및 day-of-week가 유효한 값의 범위에 대해 검증됩니다.결과 날짜는 다음 3단계 접근방식과 동등하게 계산된다.먼저 요청된 주 단위 연도의 첫 번째 주 첫째 날에 날짜를 만듭니다.그런 다음 주 단위 연도를 취하여 1을 뺀 후 날짜에 주 단위 금액을 더합니다.마지막으로 현지화된 주 내에서 올바른 요일로 조정합니다.

' '의 'WeekFields 수 등 수 .instance는 요일이 다르다.미국이나 프랑스 등 유럽 국가에서는 요일이 다른 경우가 있습니다.

를 들면, 「 」입니다.DateFormatterBuilder8 의 경우 하고 이 로케일로 합니다.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)));

★★Y캘린더가 주 년도를 지원하는 경우 주 년도를 얻습니다.(getCalendar().isWeekDateSupported())

JSTL을 .format:dateshortYYYY로 하다1번으로 하다

날짜를 앞뒤로 변환합니다.이렇게 하면 같은 해를 기대할 수 있습니다.

어떻게 발전하는지 보세요!

이건 안 좋아: YYY!

여기서 실행할 수 있습니다.

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import static java.lang.System.out;
class Playground {
    public static Date convertYYYYMMDDStr(String s) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date result = null;
        try {
            result = sdf.parse(s);
        } catch(ParseException e) {
            e.printStackTrace();
        }
        return result;
    }
    public static String formatDateToStrWithSDF(Date d, SimpleDateFormat s) {
        return s.format(d);
    }
    public static void main(String[ ] args) {
        // DON'T DO. Use yyyy instead of YYYY
        SimpleDateFormat sdfdmy = new SimpleDateFormat("dd-MM-YYYY"); 
        String jan1st2020sb = "2020-01-01";
        Date jan1st2020d = convertYYYYMMDDStr(jan1st2020sb);
        String jan1st2020sa = formatDateToStrWithSDF(jan1st2020d, sdfdmy);
        out.println(jan1st2020sb);
        out.println(jan1st2020d);
        out.println(jan1st2020sa);
        String dec31st2020sb = "2020-12-31";
        Date dec31st2020d = convertYYYYMMDDStr(dec31st2020sb);
        String dec31st2020sa = formatDateToStrWithSDF(dec31st2020d, sdfdmy);
        out.println(dec31st2020sb);
        out.println(dec31st2020d);
        out.println(dec31st2020sa);
    }
}

이것은 좋다: yyy

yyy

언급URL : https://stackoverflow.com/questions/8686331/y-returns-2012-while-y-returns-2011-in-simpledateformat

반응형