2016-07-05 23 views
0

文字列を日付用のiso形式に変換しようとしています。 「:14:2016年7月5日02 35.0」は これは私が変換しようとしている文字列です 私はこのフォーマットでそれを持っていると思いますが、ISO 8601 「2016-07-05T02:14:35.0」文字列をiso日付形式に変換する

私は、この今のところ

DateTimeFormatter format = DateTimeFormat.forPattern("YYYY-MM-DDTHH:mm:sszzz"); 
    new LocalDate(); 
    LocalDate newDate = LocalDate.parse(created,format); 
    created = newDate.toString(); 

を持っている。しかし、それは私が例に続き、私はここで間違ってやっているかわからない私は、この例外

ERROR: Illegal pattern component: T; nested exception is java.lang.IllegalArgumentException: Illegal pattern component: T 

を与えています。 ご協力いただければ幸いです。

+0

参照:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT。それがパターンを 'YYYY-MM-DD'THH:mm:sszzz'に変更するのに役立たないならば、 – shachar

+0

問題を熟考していますか? '" 2016-07-05 02:14:35.0 ".replace(" "、" T ")' –

答えて

4
 String = "yyyy-MM-dd'T'HH:mm:ss" 

ようなフォーマットを使用し 、その値がLocalDateTimeないLocalDateあります。最後に日付を取得したい場合は、最初にLocalDateTimeに変換してから、その日付の部分を取ってください。

日付の書式設定と解析を実行するときは、常に文書をよく読んでください。 Joda Timeを使用しているようです(forPatternを使用しているため、Java 8に移行することができれば有益です)。つまり、あなたはDateTimeFormat docsを読むべきです。あなたのパターンと

現在の問題:

  • あなたは代わりに 'D' の 'D' を使用しています。それは日の年を意味
  • あなたはそれを引用せずに「T」を指定した、そしてそれはとにかくパターンにあなたがあなたの価値
  • の画分の秒の部分を無視してきた
  • ではありません値にタイムゾーンインジケーターがない場合は、 'zz'を指定しました。 Tがそのように引用されているか、次に注意してください - あなた実際はあなたが"yyyy-MM-dd'T'HH:mm:ss.S"のパターンを使用すると思い、途中でTで値を解析したい場合は

    import org.joda.time.*; 
    import org.joda.time.format.*; 
    
    public class Test { 
        public static void main(String[] args) { 
         String text = "2016-07-05 02:14:35.0"; 
         DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S"); 
         LocalDateTime localDateTime = LocalDateTime.parse(text, format); 
         System.out.println(localDateTime); 
        } 
    } 
    

はここで働い例ですそれは書式指定子の代わりに文字通り扱われます。

これはであり、ちょうどの解析です。文字列をLocalDateTimeに変換しています。「文字列をISOの日付形式に変換する」ではありません。 形式のの値をISO形式で使用する場合は、適切な形式のDateTimeFormatter.printを使用する必要があります。たとえば、あなたがyyyy-MM-dd'T'HH:mm:ss.S「の形式に変換する場合があります

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "2016-07-05 02:14:35.0"; 
     DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S"); 
     LocalDateTime localDateTime = LocalDateTime.parse(text, parser); 
     DateTimeFormatter printer = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.S"); 
     String formatted = printer.print(localDateTime); 
     System.out.println(formatted); // Output 2016-07-05T02:14:35.0 
    } 
} 

上記のコードは、単一の桁の小数-の秒を処理します。 .Sの代わりに.SSSを使用して解析することができますが、実際に出力が異なる場合(たとえば、100ミリ秒の場合は.1または.100?)にする必要があります。

+0

しかし、私が望む価値はTがありません。私はTを自動的に入れる方法があると思った。 – MNM

+0

@MNM:しかし、あなたが解析している値はありません。あなたは、あなたが望む結果を私たちに示していません。別の形式に変換する必要がある場合は、2つの異なるフォーマッタが必要です。それはあなたが期待される出力を提供するのに役立ちます... –

+0

私はこのようにyyyy MM dd T HH mm ssのようにiso形式が欲しいですTは私がそこに入れたいものです。私は元の文字列を分解してそこにTを追加し、それらをまとめて連結したくないです。 – MNM

-3

はあなたが変換するために、間違ったフォーマットを使用している

 String format = "yyyy-mm-dd hh:mm:ss" 

変換するには、次の形式を使用します。 Tを使うのは、日付と時刻を分けることだけです。まずこの

+1

これは間違ったフォーマットです。 –

+0

"yyyy-MM-dd'T'HH:mm:ss"これを使用してください –

+1

これは*まだ*間違っています - 秒の小数部分は含まれていません。 12時間の時間を過ごすと、2番目のスニペットはコンパイルされません。 –

1

は、あなたのコード内のいくつかのエラーを持っている:

  • パターンは ':MM:SS.SSS YYYY-MM-DD HH' でなければなりません。大文字 -
    と小文字に注意してください。
  • LocalDateTimeを使用して日付と時刻を取得します。 LocalDateは日付のみを保持します。

訂正コード:

String created = "2016-07-05 02:14:35.000"; 
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); 
LocalDateTime newDate = LocalDateTime.parse(created,format); 
created = newDate.toString(); 
System.out.println(created); 
関連する問題