2016-11-02 6 views
0

文字列パターンで指定された年(およびおそらく他のいくつかの時間フィールド)がある場合、他の不在フィールドを最低値に設定します。例えば、従来のJava 8に私のコードは、java.timeフォーマッタで、2015.01.01 00:00:00 GMTJava 8は、すべてのフィールドが含まれていない文字列からZonedDateTimeを解析します。

しかし私を返し

String source = "2015"; 
String pattern = "yyyy"; 
DateFormat sdf = new SimpleDateFormat(pattern); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = null; 
try { 
    date = sdf.parse(source); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

SimpleDateFormat sdfGMT2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z"); 
sdfGMT2.setTimeZone(TimeZone.getTimeZone("GMT")); 

String newf = sdfGMT2.format(date); 
System.out.println(newf); 

のように見えたがTemporalAccessor返します。私は古いAPIと同じように

 
java.time.format.DateTimeParseException: Text '2008' could not be parsed: Unable to obtain 
    ZonedDateTime from TemporalAccessor: {WeekBasedYear[WeekFields[SUNDAY,1]]=2008},ISO 
     of type java.time.format.Parsed 

どのように私は、Java 8時間のAPIと同じ結果が得られない:以下のコードは、例外

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("YYYY"); 
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2008", fmt); 

例外がスローされますか?

答えて

1

それは少し冗長なのですが、あなたはあなたのDateTimeFormatterを作成する際に欠落しているフィールドのデフォルト値を指定する必要があります。

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
     .appendValue(ChronoField.YEAR) 
     .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) 
     .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) 
     .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
     .toFormatter() 
     .withZone(ZoneOffset.UTC); 

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2008", fmt); 

これはZonedDateTimeのために必要であるZoneIdが含まれています。

+0

私は '.appendPattern(" YYYY ")'にする必要がありますか? – Antonio

+0

それは、上記の 'appendValue()'がやっていることです。しかし、 'appendPattern()'を使うのであれば、 '' yyyy'(http://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoField.html#YEAR)を使うべきです。 [YYYY](http://docs.oracle.com/javase/8/docs/api/java/time/temporal/WeekFields.html#weekBasedYear--)の代わりに –

+0

はい、「YYYY」は例外を発生させます。ありがとう、それは助け!私は別のスレッドで別の質問をし、私はあなたを歓迎します:) – Antonio

関連する問題