我想写一个DateTimeFormatter
,这将允许我采取多种不同的字符串格式,然后将字符串格式转换为特定类型。由于项目的范围和已存在的代码,我不能使用不同类型的格式化程序。DateTimeFormatter接受多个类型并转换为一个
例如。 我想接受MM/dd/yyyy
以及yyyy-MM-dd'T'HH:mm:ss
,但随后转换为MM/dd/yyyy
。
有人可以建议如何做到这一点与org.joda.time.format
?
我还没有找到这个在线的好/工作示例。
我想写一个DateTimeFormatter
,这将允许我采取多种不同的字符串格式,然后将字符串格式转换为特定类型。由于项目的范围和已存在的代码,我不能使用不同类型的格式化程序。DateTimeFormatter接受多个类型并转换为一个
例如。 我想接受MM/dd/yyyy
以及yyyy-MM-dd'T'HH:mm:ss
,但随后转换为MM/dd/yyyy
。
有人可以建议如何做到这一点与org.joda.time.format
?
我还没有找到这个在线的好/工作示例。
我正在使用Joda-Time 2.9.7和JDK 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
没有时区信息。 。
@AlexKornhauser我已经更新了答案:做了一些测试,发现DST存在一些潜在的错误,所以我相应地修复了代码。 – 2017-06-14 19:42:44
我确认了这个作品。多谢你们!! ESP。 @Hugo –
我怎样才能做到这一点与java.time库相反,例如DateTimeFormatter.ofPattern(“MM/dd/yyyy”); + DateTimeFormatter.ofPattern(“yyyy-MM-dd'T'HH:mm:ss”); –
我不知道的区别是什么,但我想将字符串转换为DateTime,即DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern( “MM/DD/YYYY”); –