2017-06-14 19 views
1

私はDateTimeFormatterを書いて、複数の異なる文字列形式を取り込み、その文字列形式を特定の種類に変換できるようにしようとしています。プロジェクトのスコープと既に存在するコードのため、私は別のタイプのフォーマッタを使用できません。DateTimeFormatter複数の型を受け入れて1つに変換する

例えば、 MM/dd/yyyyyyyy-MM-dd'T'HH:mm:ssの両方を受け入れたいと思いますが、両方をMM/dd/yyyyに変換してください。

誰かがorg.joda.time.formatでこれを行う方法のアイデアを提案できますか?

このオンラインの良い/実例は見つかりませんでした。

+1

違いはわかりませんが、文字列をDateTimeに変換する、つまり、DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern( "MM/dd/yyyy"); –

答えて

3

私はを使用しています。Joda-Time 2.9.7JDK 1.7.0_79です。

あなたはDateTimeFormatterBuilder.append methodを使用することができます。私は問題を避けるためにDateTimeZone.UTCを使用しました

import org.joda.time.DateTime; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 
import org.joda.time.format.DateTimeFormatterBuilder; 
import org.joda.time.format.DateTimeParser; 

// MM/dd/yyyy format 
DateTimeFormatter monthDayYear = DateTimeFormat.forPattern("MM/dd/yyyy"); 
// array of parsers, with all possible input patterns 
DateTimeParser[] parsers = { 
    // parser for MM/dd/yyyy format 
    monthDayYear.getParser(), 
    // parser for yyyy-MM-dd'T'HH:mm:ss format 
    DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").getParser() }; 
DateTimeFormatter parser = new DateTimeFormatterBuilder() 
    // use the monthDayYear formatter for output (monthDayYear.getPrinter()) and parsers array for input (parsers) 
    .append(monthDayYear.getPrinter(), parsers) 
    // create formatter (using UTC to avoid DST problems) 
    .toFormatter().withZone(DateTimeZone.UTC); 

// test with MM/dd/yyyy 
DateTime datetime1 = parser.parseDateTime("06/14/2017"); 
System.out.println(parser.print(datetime1)); // 06/14/2017 

// test with yyyy-MM-dd'T'HH:mm:ss 
DateTime datetime2 = parser.parseDateTime("2017-06-14T10:30:40"); 
System.out.println(parser.print(datetime2)); // 06/14/2017 

:それは、すべての可能な入力パターンとパーサの配列(印刷の日付/時刻に使用されるパターンで)プリンタを受け、夏時間に合わせて例えば

は、私のデフォルトのタイムゾーン(America/Sao_Paulo)、昨年(2016年)には、DSTは番目の10月16日で開始:深夜に、時計が1時間進みを移動(そう、tecnically 、深夜にはありません時間は23:59:59から01:00:00に変更されるため、この日に存在します。

MM/dd/yyyy形式の解析時には、時、分、秒のフィールドはなく、パーサーはこれらのフィールドのデフォルト値として0を設定します(時間は深夜になります)。しかし、DSTの開始日(たとえば10/16/2016)を解析し、上記のようにUTCを使用しないと、DSTの時間シフトのためにその日に真夜中が存在しないため、コードで例外がスローされます。

DateTimeZone.UTCにはDSTの影響がないため、UTCを使用するとこのエラーを回避できます。これにより、コードはシステムのデフォルトのタイムゾーンとは独立して動作します。

出力は次のようになります。

2017年6月14日
2017年6月14日


PS:あなただけ日付部分を気にしたよう(日/月/年)、org.joda.time.LocalDateクラスを使用することもできます。これを使用するには、ちょうど(あなたが同じparserを使用することができます)コードの最後の部分を変更します。

// test with MM/dd/yyyy 
LocalDate dt1 = parser.parseLocalDate("06/14/2017"); 
System.out.println(parser.print(dt1)); // 06/14/2017 

// test with yyyy-MM-dd'T'HH:mm:ss 
LocalDate dt2 = parser.parseLocalDate("2017-06-14T10:30:40"); 
System.out.println(parser.print(dt2)); // 06/14/2017 

出力は同じです:

2017年6月14日
6月14日/ 2017

を使用すると、前述のように夏時間の問題を回避できます。この場合、LocalDateにはタイムゾーン情報がないため、UTCを設定する必要はありません。

+0

@AlexKornhauser私は答えを更新しました:いくつかのテストを行うとDSTでいくつかのポテンシャルエラーが見つかったので、コードを修正しました。 –

+2

私はこれが動作することを確認しました。みんなありがとう!! Esp。 @Hugo –

+0

DatetimeFormatter.ofPattern( "MM/dd/yyyy")のように、java.timeライブラリでこれと同じことをどうすればいいですか? + DateTimeFormatter.ofPattern( "yyyy-MM-dd'T'HH:mm:ss"); –

関連する問題