2017-10-28 15 views
-2

私は今、ほぼ6時間のためにこれを演奏し、他の質問を見て私は間違ったことは私にこれらの奇妙な結果を与えているやっているかを把握するように見えることはできませんしています。ここに私のコードが出力さDateFormat.parse()は

date string is 2017/12/30 
Date is Mon Jan 30 00:12:00 CST 2017 

ある

String dateStr = "20171230"; 
    StringBuilder sb = new StringBuilder(); 
    sb.append(dateStr.subSequence(0, 4)) 
     .append("/") 
     .append(dateStr.substring(4,6)) 
     .append("/") 
     .append(dateStr.substring(6,8)); 

    dateStr = sb.toString(); 

    System.out.println("date string is " + dateStr); 

    DateFormat df = new SimpleDateFormat("yyyy/mm/dd"); 

    df.setLenient(false); 

    Date Date = null; 

    try { 
     Date = df.parse(dateStr); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("Date is " + Date); 

を下回っている日付は12月30日であるべきではなく、なぜこれが起こっている1月30日には、誰かが私を伝えることができます。

答えて

2

使用すると、1つの単純な日付形式を使用すると、月があると思うどこに定義さ分を持って渡された書式。時間出力があまりにも午後12時12設定方法

注意してください。

代わりに、 YYYY/MM/DD

1

は私はあなたがについて尋ねた正確に何を超えて少し行くの提案のカップルを与えることを許可します。私の提案は助けになるべきだと思います。

最初に、長い古くなったクラスDateSimpleDateFormatに固執したくありません。 The modern Java date and time APIは、一般的に操作するのがはるかに良いし、不快な不意打ちも少なくなっています。 JSR-310またはjava.timeとして知られています。

第二に、それから日付を抽出する前StringBuilderを使用して文字列を再フォーマットする必要はありません。 20171230は、日付に直接解析することができます。さらに悪いことに、方法は、あなたが文字列を変換している、あなたは長さを検証していません。代わりに8の9桁があることが起こった場合、あなたはそれをキャッチし、例外をスローしたいだろうが、あなたのコードは、単に最初の8桁の数字を取り、もっとある場合は無視します。トレントンTRAMA既にthe other answerで指摘したよう

最後に、フォーマットパターン文字列は、大文字と小文字が区別されています。大文字か小文字かを問わず、どこで使用するかは重要です。間違ったケースを使用すると、誤った結果につながる可能性が高くなります。これは、旧式APIと現代APIの両方に適用されます。幸いにも、構文解析に関しては、現代のAPIは、間違ったケースを使用したときに例外をスローする傾向があるため、少なくとも間違っていると通知されます。

最後に、他の人にあなたのコードを読んでもらうときは、他のスタックオーバーフローと同じように、コーディング規則を使って助けてください。変数名は小文字で始まります。 Dateという名前のクラスとDateという名前の変数を持つと、特に混乱します。まで

上記合計:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuMMdd"); 
    String dateStr = "20171230"; 
    LocalDate date = LocalDate.parse(dateStr, dtf); 
    System.out.println("Date is " + date); 

出力は次のとおりです。

Date is 2017-12-30 

質問:私は私のJavaバージョンで近代的なAPIを使用することはできますか?

少なくともJava を使用している場合は、可能です。

  • Java 8以降では、新しいAPIが組み込まれています。
  • Java 6および7では、新しいクラスのバックポート(JSR 310のThreeTen、最新のAPIが最初に定義されています)を取得します。
  • Androidでは、Android版のThreeTen Backportを使用してください。それはThreeTenABPと呼ばれ、this question: How to use ThreeTenABP in Android Projectに素晴らしい説明があると思います。
関連する問題