2017-06-14 51 views
1

我想写一个DateTimeFormatter,这将允许我采取多种不同的字符串格式,然后将字符串格式转换为特定类型。由于项目的范围和已存在的代码,我不能使用不同类型的格式化程序DateTimeFormatter接受多个类型并转换为一个

例如。 我想接受MM/dd/yyyy以及yyyy-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:它接收打印机(与用于打印的日期/时间的图案)和解析器与所有可能的输入模式的数组:

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 

我使用DateTimeZone.UTC以避免出现问题夏令时。

例如,在我的默认时区(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小时偏移)。

使用UTC可避免此错误,因为DateTimeZone.UTC没有DST效果。有了这个,代码独立于系统的默认时区。

输出是:

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日
06/14/2017

使用LocalDate是避免夏令时问题的另一种方法(如上所述)。在这种情况下,您不需要设置UTC,因为LocalDate没有时区信息。 。

+0

@AlexKornhauser我已经更新了答案:做了一些测试,发现DST存在一些潜在的错误,所以我相应地修复了代码。 – 2017-06-14 19:42:44

+2

我确认了这个作品。多谢你们!! ESP。 @Hugo –

+0

我怎样才能做到这一点与java.time库相反,例如DateTimeFormatter.ofPattern(“MM/dd/yyyy”); + DateTimeFormatter.ofPattern(“yyyy-MM-dd'T'HH:mm:ss”); –

相关问题