web-dev-qa-db-ja.com

Java形式yyyy-MM-dd'T'HH:mm:ss.SSSzからyyyy-mm-dd HH:mm:ss

Yyyy-MM-dd'T'HH:mm:ss.SSSz形式の日付をyyyy-mm-dd HH:mm:ss形式にフォーマットしようとしていますが、これは簡単なはずですが、動作しません。

解析する必要がある日付は、2012-10-01T09:45:00.000 + 02:00の形式です。
今、この単純な日付フォーマッターを使用してフォーマットします。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE);

それでも、これは2012-10-01T09:45:00.000UTC + 00:00のような出力を提供します。

また、パターンとして「yyyy-MM-dd'T'HH:mm:ss.SSSZ」と「yyyy-MM-ddHH:mm:ss」を使用しようとしました。後者は、2012-10-01T09:45:00のクローズの形式で日付を返しますが、まだありません。

Tをサブストリング化することは少し面倒で、理由もなくオーバーヘッドを作成すると考えました。したがって、これらの日付をフォーマットする適切な方法は何でしょうか。

説明のために、2012-10-01T09:45:00.000 + 02:00を2012-10-01 09:45:00に変換します

乾杯!

42
Gooey
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse(time);
String formattedTime = output.format(d);

これは動作します。入力用と出力用の2つのSimpleDateFormatを使用する必要がありますが、必要なものだけが提供されます。

77
ctlevi

GooyeがプロジェクトでJoda Timeを使用できる場合は、このコードが役に立ちます。

String dateStr = "2012-10-01T09:45:00.000+02:00";
String customFormat = "yyyy-MM-dd HH:mm:ss";

DateTimeFormatter dtf = ISODateTimeFormat.dateTime();
LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr);

String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat));
System.out.println(dateWithCustomFormat);
8
moleksyuk

Java.time

この問題のための新しいテクノロジーがあります:Java 8以降に組み込まれたJava.timeフレームワーク。

入力文字列は標準ISO 8601形式です。その標準は、日時値のテキスト表現の解析/生成のために、Java.timeクラスでデフォルトで使用されます。

OffsetDateTime odt = OffsetDateTime.parse( "2012-10-01T09:45:00.000+02:00" );

質問は、1秒に切り捨てることを示唆しています。

OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo( ChronoUnit.SECONDS );

オフセットとタイムゾーン情報を省略したいようです。事前定義されたフォーマッター DateTimeFormatter.ISO_LOCAL_DATE_TIME がそれを行います。

そして、どうやら、標準のTではなく、真ん中にスペースを使用したいようです。このために独自のフォーマッタを定義できますが、文字列操作を行ってTをSPACEに置き換えます。

String output = odtTruncatedToWholeSecond.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " );

単純な文字列操作

質問に対するコメントが示唆するように、厳密に言えば、文字列のみを使用し、日時オブジェクトに変換しないことで目標を達成できます。ただし、これらの日時値を処理する他のビジネスロジックがある可能性があると仮定して、ここでこの回答を提供します。


Java.timeについて

Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.DateCalendar 、および SimpleDateFormat などの厄介な古い レガシー 日時クラスに取って代わります。

メンテナンスモード になった Joda-Time プロジェクトは、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 31 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列やJava.sql.*クラスは必要ありません。

Java.timeクラスはどこで入手できますか?

  • Java SE 8Java SE 9 、およびそれ以降
    • ビルトイン。
    • 実装がバンドルされた標準Java AP​​Iの一部。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および Java SE 7
    • Java.time機能の多くは、 ThreeTen-Backport のJava 6および7にバックポートされています。
  • Android
    • Androidの後のバージョンは、Java.timeクラスの実装をバンドルします。
    • 以前のAndroidの場合、 ThreeTenABP プロジェクトはThreeTen-Backport(上記)に適合します。 ThreeTenABPの使用方法… を参照してください。

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter 、および more などの便利なクラスがあります。

8
Basil Bourque

JSON応答から受信した日付文字列をフォーマットしようとしていました。 2016-03-09T04:50:00-0800からyyyy-MM-ddだからここに私が試したものがあり、それはうまく機能し、フォーマットされた日付文字列をカレンダーウィジェットに割り当てるのに役立ちました。

String DATE_FORMAT_I = "yyyy-MM-dd'T'HH:mm:ss";
String DATE_FORMAT_O = "yyyy-MM-dd";


SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I);
SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O);

Date date = formatInput.parse(member.getString("date"));
String dateString = formatOutput.format(date);

これはうまくいきました。ありがとう。

3
Kiran Madanwad

あなたが本当に速くなければならないなら(あなたがそうすることを私は信じない):

char[] chars = sourceDate.toCharArray();
chars[10] = ' ';
String targetDate = new String(chars, 0, 19);
1
Hot Licks
String dateStr = "2016-09-17T08:14:03+00:00";
String s = dateStr.replace("Z", "+00:00");
s = s.substring(0, 22) + s.substring(23);
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(s);
Timestamp createdOn = new Timestamp(date.getTime());
mcList.setCreated_on(createdOn);

Java 7では、ISO 8601に従ってタイムゾーン記述子のサポートが追加されました。これは、Java 7で使用できます。

0
Sangram Badi