web-dev-qa-db-ja.com

文字列の日付形式の変更

私の現在の日付形式は:08/11/2008 00:00

この出力を2008/11/0800:00に変換する必要があります。ただし、調査したSimpleDateFormatを使用すると、変換できず、まったく異なる出力が得られます。コードは次のとおりです。

SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm")
Date starting= simpleDateFormat2.parse(startTime);
System.out.println("" + simpleDateFormat2.format(starting) + " real date " + startTime);

次の出力が発生することを考えると、正しい文字列で解析していることを私は知っています:

0014/05/01 00:00 real date 08/11/2008 00:00

代わりに0014/05/0100:00を検出したメカニズムについてはよくわかりません

2008/11/08 00:00

私はすべての提案を楽しみにしています事前に感謝します

6
Clement Ong

最初に行う必要があるのは、元の値をDateオブジェクトに解析することです

String startTime = "08/11/2008 00:00";
// This could be MM/dd/yyyy, you original value is ambiguous 
SimpleDateFormat input = new SimpleDateFormat("dd/MM/yyyy HH:mm");
Date dateValue = input.parse(startTime);

それが済んだら、dateValueを好きなようにフォーマットできます...

SimpleDateFormat output = new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println("" + output.format(dateValue) + " real date " + startTime);

出力:

2008/11/08 00:00 real date 08/11/2008 00:00

0014/05/01 00:00を取得する理由は、SimpleDateFormatyyyy/MM/dd HH:mmを使用する場合)が年に08、月に11、および2008その日は、値の内部ローリングを実行して、値を有効な日付に修正します

9
MadProgrammer

私は現代の答えに貢献したいと思います。

    DateTimeFormatter currentFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm");
    DateTimeFormatter convertedOutputFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm");
    String startTime = "08/11/2008 00:00";
    LocalDateTime starting = LocalDateTime.parse(startTime, currentFormatter);
    System.out.println(starting.format(convertedOutputFormatter));

このプリント

2008/11/08 00:00

使用しようとしたSimpleDateFormatクラスは古く、面倒なことで有名です。あなたはそれを経験しましたが、少し問題がありました。代わりに、最新のJava日付と時刻のAPIであるJava.timeを使用して推奨しています。

他の人が言っているように、2つのフォーマッターを使用する必要があります。1つは現在のフォーマットを指定するためのもので、もう1つは目的のフォーマットを指定するためのものです。

コードで何が問題になりましたか?

フォーマットパターンyyyy/MM/dd HH:mmのフォーマッタは、2008年8月11日を西暦8年目の11か月目の2008日として解釈しました。 11月は30日しかないというデフォルト設定では、SimpleDateFormatを邪魔することはなく、次の月と年にカウントを続け、5年半後の日付になります(2008をで割った値) 365.25は5.5に非常に近いです)。

質問:JavaバージョンでJava.timeを使用できますか?

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

  • Java 8以降では、新しいAPIが組み込まれています。
  • Java 6および7では、新しいクラスのバックポートであるThreeTenバックポートを取得します(最新のAPIが最初に説明されたJSR 310のThreeTen)。
  • (古い)Androidでは、ThreeTenBackportのAndroidエディション。ThreeTenABPと呼ばれます。パッケージorg.threeten.bpとサブパッケージから日付と時刻のクラスをインポートしてください。

リンク

3
Ole V.V.

これは、解析したソースの日付文字列がSimpleDateFormatterとは異なる形式であるためです。ソースはMM/dd/yyyy HH:mm形式です。 SimpleDateFormatの文字列をMM/dd/yyyy HH:mmに変更します。

最初の形式の後に別の形式を使用してみてください。

SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("MM/dd/yyyy HH:mm");
//You gotta parse it to a Date before correcting it
Date parsedDate = simpleDateFormat2.parse(startTime);
simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm")
String newFormatttedDate = simpleDateFormat2.format(parsedDate);
3
MetaSnarf

日付を解析しています08/11/2008 00:00形式はyyyy/MM/dd HH:mmしかし、この日付ではないこの形式では。

0
tkausl