2016-10-15 13 views
0

データベースからの日付がタイプ番号として取得されています。 私はそれを日付に変換する必要があります。たとえば、日付が070311の場合、データベースから抜き出しながら、Javaで70311を取得しています。 番号がないので0が失われます。 私はこの数字を文字列に変換してから日付にフォーマットしますが、必要に応じて07/03/11を与えません。javaの日付として変換番号dMMyyを変換

私は08/09/0003で土曜9月8日午後12時00分00秒IST 3 を取得していますが、それは07/03/11のようにすると仮定
String strDate = String.valueOf(70311); 
Date date = new SimpleDateFormat("ddMMyy").parse(str); 

出力日付。

答えて

3

フォーマット文字列のddは、日数を表す2桁の数字を意味します。あなたの文字列では、先導0を削除したので、曜日の値は1桁になりました。したがって正しい形式の文字列はとなり、正しい日付が得られます。

もっと良い解決策は、日付を整数として扱わないで、先頭に0をつけて数字をあらかじめ埋め込むことで、先導0を失っていないことを確認することです。

とにかく、この場合、迅速な解決策は、このようになります:

String strDate = "0" + String.valueOf(70311); 
Date date = new SimpleDateFormat("ddMMyy").parse(strDate); 

それとも

String strDate = String.valueOf(70311); 
Date date = new SimpleDateFormat("dMMyy").parse(strDate); 

は、より多くの詳細については、SimpleDateFormatマニュアルを参照してください。


編集

(左側0秒で埋め)正しい形式の文字列を取得するより信頼性の高い方法は、このように、String.formatを使用することです:

String.format("%06d", num); 

コメントに指摘されているように、これにより、0が必要な場合にのみ追加されます。

String strDate = String.format("%06d", 70311); 
Date date = new SimpleDateFormat("ddMMyy").parse(strDate); 
+1

正面にゼロを追加するのは良い解決策ですが、文字列の長さが6桁であるかどうかを確認することもお勧めします。あなたは、コーディングの際にすべての限界的なケースを処理する必要があります。 – deadfish

+0

@deadfish私はそれがOPのコメントだと思っていますか?私は最終的な解決策はすべてのエッジケースを処理する必要があることに同意しますが、このコードのさらなる改善はこの質問/回答の範囲を超えている可能性が高く、読者のための練習として残されています。私は、この問題の理想的な解決策は、データベースから日付を読み込み、それを文字列に変換されて日付として解釈される整数として格納しないことです。 p.s. 'String.valueOf(70311)'は常に* 5桁ですので、この解決法を一般化しない限り、長さのチェックは無意味です。 – nbrooks

+0

はい、あなたは正しいです。最善の解決策は、タイムスタンプに日付を格納し、読み込み可能な日付にしてフォーマットすることです。しかし、私の最初のコメントはあなたの最初の解決策に関するものでした。現在の日の数が9より大きい場合、あなたの 'strDate'は' 0130311'のようになります。 – deadfish

1

Answer by nbrooksは優れていますが、古いクラスが使用されています。

LocalDate

彼の説明を読みますが、現代のjava.timeクラスを使用します。

LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。ところで

int inputNumber = 70311 ; 
String inputModified = String.format("%06d", inputNumber) ; 

DateTimeFormatter f = DateTimeFormatter.ofPattern("ddMMuu") ; 
LocalDate ld = LocalDate.parse(inputModified , f); 

、整数に日付値を絞るのこのアイデアはひどいです。日時データをシリアル化する場合は、標準のISO 8601形式を使用します。日付の場合、2011年3月7日は2011-03-07になります。これらの形式は、文字列を生成および解析するときにjava.timeクラスでデフォルトで使用されます。あいまいさと読みにくさは、2桁のスペースでは価値がないため、常に4桁の数字を使用してください。java.timeについて


java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date,.Calendar,& java.text.SimpleDateFormatなどの面倒な古いlegacy日時クラスに取って代わります。

にあるJoda-Timeプロジェクトは、java.timeへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
    • ThreeTenABPプロジェクトはThreeTen-バックポート具体的にAndroidのため(上記)を適応させます。
    • How to use…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。