如何从Java中的字符串解析不同的日期格式(常见问题)

时间:2018-07-30 05:03:47

标签: datetime locale simpledateformat

很多时候,我试图弄清楚如何解析不同的日期格式。在输入中,我们有几行:

1987-03-23
null
1985-11-29
23-07-2000
17-10-1984

应将其翻译成dd.MM.yyyy俄语(如在我的任务中一样,可以更改)格式,并在不匹配该模式的地方绘制破折号。

我决定是这样

public class DateUtil {
public static String validDateString(String strDate) {
final List<String> dateFormats = Arrays.asList("yyyy-MM-dd", "dd-MM-yyyy", "MM-dd- 
yyyy", "MM/dd/yyyy", "dd/MM/yyyy");
SimpleDateFormat sdf;
//Our new format
final String RU_FORMAT = "dd.MM.yyyy";
String output = "-";
//Reviewing for all templates
for (String format : dateFormats) {
    sdf = new SimpleDateFormat(format, new Locale("ru"));
    //Do not try to analyze dates that do not match the format
    sdf.setLenient(false);
    try {
        if (sdf.parse(strDate) != null) {
            Date date = sdf.parse(strDate);
            sdf.applyPattern(RU_FORMAT);
            return sdf.format(date);
        }
        break;
    } catch (ParseException e) {

    }
 }
 //Display line with a dash
 return output;
 }
}

您可以在此行中调用此方法:

DateUtil.validDateString(input_line);

1 个答案:

答案 0 :(得分:0)

避免使用旧的日期时间类

旧的DateCalendarSimpleDateFormat类是糟糕的糟糕设计。切勿使用它们。现在已被 java.time 类取代。

解析

首先测试输入字符串是否等于“ null”。

接下来,仅使用LocalDate.parse( "1987-03-23" )解析第一种格式并捕获异常。默认情况下会处理该标准ISO 8601格式,因此无需指定格式格式。

最后,定义一个格式设置模式DateTimeFormatter.ofPatten( "dd-MM-uuuu" )并用LocalDate.parse( input , formatter )进行解析。捕获异常。

如果所有这些都失败,那么您会有意外的输入。

生成字符串

一旦手头有一个LocalDate对象,请使用LocalDate.format生成一个字符串,并在其中传递一个DateTimeFormatter。您可以定义一个格式化模式,如上所示。或者,您可以调用DateTimeFormatter.ofLocalizedDate来让 java.time 为您自动本地化。

搜索堆栈溢出

这个问题已经被涵盖了很多次了。在Stack Overflow中搜索这些类名,以查看更多详细信息和更多代码。

我建议使用具有site:stackoverflow.com条条件的搜索引擎,因为Stack Overflow中的内置搜索功能很弱,并且倾向于忽略Answers,仅偏向于Questions。

例如,执行以下操作:

https://duckduckgo.com/?q=site%3Astackoverflow.com+java+DateTimeFormatter&t=h_&ia=web


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore