programing

새 날짜 시간 API를 사용하여 날짜 형식 지정

prostudy 2022. 7. 10. 21:30
반응형

새 날짜 시간 API를 사용하여 날짜 형식 지정

새로운 date time API를 사용하고 있었는데 실행할 때:

public class Test {         
    public static void main(String[] args){
        String dateFormatted = LocalDate.now()
                                        .format(DateTimeFormatter
                                              .ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(dateFormatted);
    }
}

슬로우:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay
    at java.time.LocalDate.get0(LocalDate.java:680)
    at java.time.LocalDate.getLong(LocalDate.java:659)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
    at java.time.LocalDate.format(LocalDate.java:1685)
    at Test.main(Test.java:23)

LocalDate 클래스의 소스 코드를 보면 다음과 같이 표시됩니다.

  private int get0(TemporalField field) {
        switch ((ChronoField) field) {
            case DAY_OF_WEEK: return getDayOfWeek().getValue();
            case ALIGNED_DAY_OF_WEEK_IN_MONTH: return ((day - 1) % 7) + 1;
            case ALIGNED_DAY_OF_WEEK_IN_YEAR: return ((getDayOfYear() - 1) % 7) + 1;
            case DAY_OF_MONTH: return day;
            case DAY_OF_YEAR: return getDayOfYear();
            case EPOCH_DAY: throw new UnsupportedTemporalTypeException("Invalid field 'EpochDay' for get() method, use getLong() instead");
            case ALIGNED_WEEK_OF_MONTH: return ((day - 1) / 7) + 1;
            case ALIGNED_WEEK_OF_YEAR: return ((getDayOfYear() - 1) / 7) + 1;
            case MONTH_OF_YEAR: return month;
            case PROLEPTIC_MONTH: throw new UnsupportedTemporalTypeException("Invalid field 'ProlepticMonth' for get() method, use getLong() instead");
            case YEAR_OF_ERA: return (year >= 1 ? year : 1 - year);
            case YEAR: return year;
            case ERA: return (year >= 1 ? 1 : 0);
        }
        throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

문서에서 설명한 바와 같이:

이 메서드는 클래스 설명서에 설명된 대로 간단한 문자 및 기호 패턴을 기반으로 포맷터를 만듭니다.

그리고 이 모든 글자들은 정의되어 있습니다.

그럼 왜?DateTimeFormatter.ofPattern패턴 문자를 사용할 수 없나요?

LocalDate는 날짜만 나타내며 Date Time은 나타냅니다.즉, "HH:mm:ss"는 이 명령어를 포맷할 때 의미가 없습니다.LocalDate. 를 사용합니다.LocalDateTime대신 날짜와 시간을 모두 나타내는 것으로 가정합니다.

@James_D의 정답에 다음 내용을 추가하고 싶습니다.

배경:가장 많은 날짜 및 시간 라이브러리(java.util.Calendar를 참조해 주세요.Net-Date Time 또는DateJavaScript 또는DateTimePerl에서)는 범용 범용 고유 시간 유형의 개념을 기반으로 합니다(독일어에는 "eierlegende Wollmilchsau"라는 시적 표현이 있습니다).이 설계에서는 지원되지 않는 필드가 있을 수 없습니다.그러나 그 대가는 높다: 많은 시간 문제는 모든 종류의 시간적 사물에 대한 공통 분모를 찾기 어렵기 때문에 그러한 다루기 어려운 접근법으로는 적절하게 처리될 수 없다.

JSR-310은 지원되는 임베디드 필드의 유형별 세트로 구성된 다른 시간 유형을 허용하는 다른 방법을 선택했습니다.따라서 모든 가능한 필드가 모든 유형에서 지원되는 것은 아닙니다(또한 사용자는 자신의 특수 필드를 정의할 수도 있습니다).또한 모든 유형의 객체를 프로그래밍 방식으로 요청할 수 있습니다.TemporalAccessor지원되는 특정 필드 세트에 대해 설명합니다.위해서LocalDate다음과 같은 것을 찾을 수 있습니다.

•DAY_OF_WEEK 
•ALIGNED_DAY_OF_WEEK_IN_MONTH 
•ALIGNED_DAY_OF_WEEK_IN_YEAR 
•DAY_OF_MONTH 
•DAY_OF_YEAR 
•EPOCH_DAY 
•ALIGNED_WEEK_OF_MONTH 
•ALIGNED_WEEK_OF_YEAR 
•MONTH_OF_YEAR 
•PROLEPTIC_MONTH 
•YEAR_OF_ERA 
•YEAR 
•ERA 

HOUR는 없습니다.OF_DAY 필드에서는 다음 문제를 설명합니다.UnsupportedTemporalTypeException패턴 기호를 필드에 매핑하는 JSR-310을 보면 기호 H가 지원되지 않는HOUR_에 매핑되어 있는 것을 알 수 있습니다.OF_Day:

/** Map of letters to fields. */  
private static final Map<Character, TemporalField> FIELD_MAP = new HashMap<>();
static {
  FIELD_MAP.put('G', ChronoField.ERA);
  FIELD_MAP.put('y', ChronoField.YEAR_OF_ERA);
  FIELD_MAP.put('u', ChronoField.YEAR);
  FIELD_MAP.put('Q', IsoFields.QUARTER_OF_YEAR);
  FIELD_MAP.put('q', IsoFields.QUARTER_OF_YEAR);
  FIELD_MAP.put('M', ChronoField.MONTH_OF_YEAR);
  FIELD_MAP.put('L', ChronoField.MONTH_OF_YEAR);
  FIELD_MAP.put('D', ChronoField.DAY_OF_YEAR);
  FIELD_MAP.put('d', ChronoField.DAY_OF_MONTH);
  FIELD_MAP.put('F', ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);
  FIELD_MAP.put('E', ChronoField.DAY_OF_WEEK);
  FIELD_MAP.put('c', ChronoField.DAY_OF_WEEK);
  FIELD_MAP.put('e', ChronoField.DAY_OF_WEEK);
  FIELD_MAP.put('a', ChronoField.AMPM_OF_DAY);
  FIELD_MAP.put('H', ChronoField.HOUR_OF_DAY);
  FIELD_MAP.put('k', ChronoField.CLOCK_HOUR_OF_DAY);
  FIELD_MAP.put('K', ChronoField.HOUR_OF_AMPM);
  FIELD_MAP.put('h', ChronoField.CLOCK_HOUR_OF_AMPM);
  FIELD_MAP.put('m', ChronoField.MINUTE_OF_HOUR);
  FIELD_MAP.put('s', ChronoField.SECOND_OF_MINUTE);
  FIELD_MAP.put('S', ChronoField.NANO_OF_SECOND);
  FIELD_MAP.put('A', ChronoField.MILLI_OF_DAY);
  FIELD_MAP.put('n', ChronoField.NANO_OF_SECOND);
  FIELD_MAP.put('N', ChronoField.NANO_OF_DAY);    
}

이 필드 매핑은 필드가 콘크리트 유형에서 지원되는 것을 의미하지 않습니다.해석은 몇 가지 단계로 이루어집니다.필드 매핑은 첫 번째 단계일 뿐입니다.그런 다음 두 번째 단계는 유형의 원시 개체로 구문 분석하는 것입니다.TemporalAccessor마지막으로 해석은 타겟타입에 위임합니다)을 해석합니다.LocalDate해석된 중간 객체의 모든 필드 값을 받아들일지 여부를 결정합니다.

나에게 맞는 수업은 시간과 시간대가 모두 포함된 수업이었다.

LocalDate에, 「시간」이 됩니다.UnsupportedTemporalTypeException: Unsupported field: HourOfDay.

하시면 됩니다.LocalDateTime가 없기 에 (포맷 중 그 (이러한 포맷을 사용하여도) 이 됩니다.UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds.

언급URL : https://stackoverflow.com/questions/23069370/format-a-date-using-the-new-date-time-api

반응형