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に変換します
乾杯!
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を使用する必要がありますが、必要なものだけが提供されます。
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);
この問題のための新しいテクノロジーがあります: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 8以降に組み込まれています。これらのクラスは、 Java.util.Date
、 Calendar
、および SimpleDateFormat
などの厄介な古い レガシー 日時クラスに取って代わります。
メンテナンスモード になった Joda-Time プロジェクトは、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 31 です。
Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列やJava.sql.*
クラスは必要ありません。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
、および more などの便利なクラスがあります。
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);
これはうまくいきました。ありがとう。
あなたが本当に速くなければならないなら(あなたがそうすることを私は信じない):
char[] chars = sourceDate.toCharArray();
chars[10] = ' ';
String targetDate = new String(chars, 0, 19);
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で使用できます。