将java中的日期格式自定义为特定的顺序



我有以下字符串变量,其中日期以dd/mm/yy的格式存储,即英国格式

String s= "04-MAR-15"
String t ="04/03/15"
String p ="04/03/2015"
String w ="04-03-2015"

现在我想将它们的格式转换为DD/MM/YYYY格式,请告诉我如何通过java中的简单日期格式转换它们的格式并在控制台上显示。

该过程分为两步:

  • 使用DateFormatparse方法将String转换为Date
  • 使用具有所需格式的DateFormat的方法格式将Date转换为新的String

使用SimpleDateFormat混凝土类。请参阅文档以了解所需的模式。

尝试使用每个期望的格式进行解析

当您有各种格式的输入时,如果这些格式是互斥的(彼此之间没有歧义),只需尝试解析每个已知的可能格式,直到一个有效为止。当解析尝试失败时,捕获抛出的Exception并尝试使用下一种格式进行解析。

有关将字符串解析为仅限日期对象的更多信息,请参阅How can I change the date format in Java?以及已经在Stack Overflow上发布的许多其他帖子。下面是一个简单的代码示例。

首先,为每个期望的格式定义并收集一系列格式化程序。

Locale locale = Locale.UK ;
List<DateTimeFormatter> formatters = new ArrayList<>( 4 );
formatters.add( DateTimeFormatter.ofPattern( "dd-MMM-uu" , locale ) ) ;
formatters.add( DateTimeFormatter.ofPattern( "dd-MM-uu" , locale ) ) ;
formatters.add( DateTimeFormatter.ofPattern( "dd/MM/uuuu" , locale ) ) ;
formatters.add( DateTimeFormatter.ofPattern( "dd-MM-uuuu" , locale ) ) ;

依次尝试每个格式化程序,直到成功为止。

LocalDate ld = null ;
for( DateTimeFormatter f : formatters ) {
    try{
        ld = LocalDate.parse( input , f );
        break ; // End this 'for' loop. We succeeded in parsing, so no need to try more formatters. 
    } catch ( DateTimeParseException e ) {
        // Swallow this exception as we expect it when trying a series of formatters.
    }
}

测试是否所有格式化程序都未能解析。这意味着我们收到了一个意外格式的输入,一个错误情况。

if( null == ld ) {  // All the formatters were tried but failed.
    … // Deal with unexpected input.
}

使用DateTimeFormatter生成一个新的字符串作为输出。考虑使用ofLocalized…方法,而不是指定特定的格式。

ISO 8601

就我个人而言,我建议不要使用两位数的年份。这导致了对月份和日期的混淆。内存足够便宜,屏幕足够大,我们可以很容易地负担得起比特和像素,以支持4位数的奢侈岁月。

此外,考虑完全避免你的模式。对于数据交换,请仅使用标准ISO 8601格式。仅适用于YYYY-MM-DD的日期,例如2017-01-23


关于java.time

java.time框架是在java 8及更高版本中构建的。这些类取代了诸如java.util.DateCalendar和&SimpleDateFormat

JodaTime项目现在处于维护模式,建议迁移到java.Time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。

从哪里获得java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置
    • 标准Java API的一部分,带有捆绑实现
    • Java 9添加了一些小功能和修复程序
  • Java SE 6Java SE 7
    • 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
  • 安卓
    • ThreeTenABP项目专门为安卓系统改编了ThreeTen Backport(如上所述)
    • 请参阅如何使用ThreeTenABP…

ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。

最新更新