2013-03-31 20 views
31

yyyy-MM-dd'T'HHで日付をフォーマットしようとしています。 mm:ss.SSSフォーマットからyyyy-mm-dd HH:mm:ssに簡単にする必要がありますが、動作させることはできません。 45:2012-10-01T09:Javaフォーマットyyyy-MM-dd'T'HH:mm:ss.SSSz〜yyyy-mm-dd HH:mm:ss

解析されなければならない日がの形である00.000 + 02:00
今私はそれをフォーマットするために、この単純な日付フォーマッタを使用:

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

これにより、2012-10-10T09:45:00.000UTC + 00:00のような出力が得られます。

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

T awayの部分文字列はちょっと混乱していて、何の理由もなくオーバーヘッドを作成すると考えられました。したがって、これらの日付をフォーマットする正しい方法は何でしょうか? 45:00.000 + 02:00

9時45分00秒2012年10月1日に乾杯私は2012-10-01T09を変換したい示すために

+0

に使用することができるSubstringing日付オブジェクトから/への変換よりもはるかに高速/簡単であるディスクリプタ。オリジナルを2つの部分文字列(固定オフセット)に分割し、その間にブランクを連結します。 –

+0

これはなぜですか?私は100回以上の日付を一度に解析するかもしれません。 – Gooey

+0

ハードコードされたオフセットと2つの連結演算子を持つ2つの部分文字列演算が、2つの日付フォーマッタを構築し実行するよりも速くなるとは思わないでしょうか? –

答えて

57
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つのSimpleDateFormatsを使用する必要がありますが、必要なものだけを提供します。

+0

それは開始時に12を追加します...私は2014年2月5日の日付を期待しますが、それは私に与えます122/05/2017 – VVB

6

Gooyeそれはあなたのプロジェクトにジョダ時間を使用することが可能ですならば、このコードは私の作品:

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); 
+2

何も依存関係を追加することはありません。それはJDKに存在し、Chris Tateの回答 – Aubin

+0

を参照してください。私はそれがJava 7ではなくJava 8で動作すると思います。 –

+0

@Sam、これはjoda-timeライブラリを使用しているため、どのJavaバージョンでも動作します。プロジェクトにインポートし、必要な依存関係をインポートするだけです。 – moleksyuk

1

あなたは本当にお奨め(私はあなたが信じられないことに)高速である場合:私は、JSONレスポンスから受け取った日付文字列をフォーマットしようとしていた

char[] chars = sourceDate.toCharArray(); 
chars[10] = ' '; 
String targetDate = new String(chars, 0, 19); 
1

例えば2016-03-09T04:yyyy-MM-ddに50:00-0800。だからここで試したことが働いて、フォーマットされた日付文字列にカレンダーウィジェットを割り当てる手助けをしました。

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); 

これは機能しました。ありがとう。後でJavaの8とに組み込まれてjava.timeフレームワーク:

+0

この回答は質問の詳細には対処しません。そして、それは[3歳の受け入れられた回答](http://stackoverflow.com/a/15730771/642706)のアイデアを複製します。だから私はどんな価値も追加されていないと思う。 Stack Overflowに参加したいことを嬉しく思います。しかし、あなたの答えは、質問の詳細に対処し、重複しないようにする必要があります。 –

4

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をスペースで置き換える文字列操作を行います。

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

は単に質問にコメントとして

文字列操作は、厳密にあなたは文字列のみを使用し、任意の日付時刻オブジェクトに変換しないであなたの目標を達成することができ言えば、示唆しています。しかし、私はあなたがこれらの日付/時刻値を扱うための他のビジネスロジックを持っていると仮定して、この回答をここに提供します。


についてjava.time

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

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

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

java.timeオブジェクトをデータベースと直接交換することができます。 JDBC 4.2以降に準拠するJDBC driverを使用してください。文字列の必要はなく、java.sql.*クラスは不要です。

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

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

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

+0

のみJava 8以上 –

+1

@Sangram実際には、Java 8だけではありません。java.timeの機能の多くは、[ThreeTen-Backport](http:// www。 threeten.org/threetenbp/)プロジェクトに参加し、さらに[ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP)プロジェクトでAndroidに対応しました。 –

0
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

関連する問題