私はを使用しています。Joda-Time 2.9.7とJDK 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
を設定する必要はありません。
違いはわかりませんが、文字列をDateTimeに変換する、つまり、DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern( "MM/dd/yyyy"); –