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

Datetime 如何从Java中的字符串解析不同的日期格式(常见问题),datetime,locale,simpledateformat,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> date

很多次,我都试图找出如何解析不同的日期格式。在输入上,我们有一些行:

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;
 }
}
避免遗留日期时间类 旧的
日期
日历
SimpleDateFormat
类是糟糕的设计造成的糟糕局面。永远不要使用它们。现在被java.time类取代

解析 第一个测试输入字符串是否等于“null”

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

最后,定义一个格式化模式
DateTimeFormatter.ofpaten(“dd-MM-uuu”)
并用它进行解析,调用
LocalDate.parse(输入,格式化程序)
。异常陷阱

如果所有这些都失败了,那么您将获得意外的输入

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

搜索堆栈溢出 这已经被讨论过很多次了。在堆栈溢出中搜索这些类名,以查看更多详细信息和代码

我建议使用带有
site:stackoverflow.com
标准的搜索引擎,因为stackoverflow中内置的搜索功能很弱,并且倾向于忽略答案,只偏向于问题

例如,请执行以下操作:


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

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

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(
      DateUtil.validDateString(input_line);