2017-06-08 8 views
0

基本的には、日付を設定してリストに保存します。入力日付を設定してリストに追加します

public List<RecordList> createRecord(BigDecimal yr){ 

    for (int index = 0; index <= 14; index++) { 
     RecordList value = new RecordList(); 
     if(index == 0){ 
      value.setStartDt(toDate(("01-04-" + yr))); 
      value.setEndDt(toDate(("30-04-" + yr))); 
     } 
     if(index == 1){ 
      value.setStartDt(toDate(("01-05-" + yr.add(new BigDecimal(1))))); 
      value.setEndDt(toDate(("31-05-" + yr.add(new BigDecimal(1))))); 
     } 
     createRecord.add(newRecordValue); 
    return createRecord; 
} 

private Date toDate(String date) { 
    Date newDate = null; 
    try { 
     newDate = new SimpleDateFormat("dd-MM-YYYY").parse(date); 
    } 
    catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return newDate; 
} 

私は2017年に年を設定するとき、私が設定したもので、出力のdoesntが一致し、されて何が起こるか:

"StartDate": "30-12-2017", 
"EndDate": "30-12-2017" 
と、それはそれの代わりに、来年に増分をdoesntの下の私のコードからデクリメント:

"StartDate": "30-12-2016", 
"EndDate": "30-12-2016" 
+0

これは、JSR-310(Java 8に組み込まれ、Java 6および7にもバックポートされています)の 'LocalDate'を使って行う方がはるかに簡単で自然です。最近では、 'SimpleDateFormat'を使うべきではありません。特にこのようなタスクのためではありません。 –

答えて

5

大文字Yは週年です。あなたは暦年のための小文字のyを使用する必要があります。

newDate = new SimpleDateFormat("dd-MM-yyyy").parse(date); 

の詳細については@Jensの答えが正しいと受け入れられるべきであるSimpleDateFormat

2

のJavadocを読んでください。

私はいくつかの提案を追加しますエラー処理の改善方法。ご覧のとおり、SimpleDateFormatはあなたのコードに何が間違っているかについては何も話していません。そして、私は、この動作が、すでに多くの人々に、時には "驚くべき"振る舞いを持つパース・コードのトンを公開させてしまったと確信しています。幸運にもという偶然によってが何か問題があることが判明しました。


のJava-8

新しいビルトインライブラリjava.time(利用可能なJavaの-8以降)次のエラーメッセージで例外

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-YYYY"); 
LocalDate d = LocalDate.parse("30-12-2017", dtf); 

を解析しますがスローではないでしょう。

スレッド "main"の例外java.time.format.DateTimeParseException: テキスト'30は-12-2017' を解析できませんでした:TemporalAccessorからLOCALDATE を取得できません:{MonthOfYear = 12、 WeekBasedYear [WeekFields [月曜日、4] = 2017、DAYOFMONTH = 30} ...

エラーメッセージに「WeekBasedYear」フィールドが存在すると、何が間違っているかを啓発して、適切なパターンシンボルを探すためのドキュメントに移動する必要があります。

ちなみに、Java-6 + 7用のバックポートThreeten-BPもあります。そして、私は今も人気のライブラリジョダ-時間をテストした:

DateTimeFormatter dtf = DateTimeFormat.forPattern("dd-MM-YYYY"); 
System.out.println(dtf.parseLocalDate("30-12-2017")); // 2017-12-30 (don't use it!) 

だから、Javaの-8はまた、あなたのパターンですべての問題を見ていないジョダ時のために改良したものです。ここで


マイライブラリTime4J

ChronoFormatter<PlainDate> cf = 
    ChronoFormatter.ofDatePattern("dd-MM-YYYY", PatternType.CLDR, Locale.ROOT); 
LocalDate d = cf.parse("30-12-2017").toTemporalAccessor(); // not even executed 

パーサの構築は、次のメッセージで失敗します。

java.lang.IllegalArgumentExceptionが:
Y週間based-など年は週の日付形式が必要です:dd-MM-YYYY

関連する問題