关于datetime:如何在Java 8中通过一种方法将字符串中的两个不同日期(2019-12-23 12:40:43.777和2019-12-23 12:40:43)转换为2019-12-23格式?

How to convert two different dates in string (2019-12-23 12:40:43.777 and 2019-12-23 12:40:43) to 2019-12-23 format in java 8 in one single method?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String args[]){    
     Pattern pattern = Pattern.compile("^([0-9]{4}[-][0-9]{2}[-][0-9]{2}\\\\s+[0-9]{2}[:][0-9]{2}[:][0-9]{2})[.]*([0-9]*)$");
     String mydata ="2019-12-23 12:40:43.775936";//case1
     //String mydata ="2019-12-23 12:40:43";//case2
     Matcher matcher = pattern.matcher(mydata);
     if(matcher.matches()) {
         System.out.println(matcher.group(1));
     }                                
    DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime date = LocalDateTime.parse(matcher.group(1), dtf);
    ZonedDateTime     zdt  = date.atZone(ZoneId.of("Asia/Kuwait"));
    System.out.println(zdt.toInstant().toEpochMilli());

}

当前,我正在使用正则表达式来做到这一点。我想避免使用正则表达式,以便我的代码可用于情况1和情况2。请提出建议。


这里不需要正则表达式,您只需要这种模式

1
yyyy-MM-dd HH:mm:ss[.SSSSSS]

这是一个简单的示例,代码如何:

1
2
3
4
5
6
7
String[] dates  = {"2019-12-23 12:40:43.775936","2019-12-23 12:40:43"};
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss[.SSSSSS]");
for (String date: dates){
    LocalDateTime ldt = LocalDateTime.parse(date, dtf);
    LocalDate ld = ldt.toLocalDate();
    System.out.println(ld);
}

输出

1
2
2019-12-23
2019-12-23

编辑

.. the above code does not work for date in this format : 2019-12-23 12:40:43.888

如果您使用多种格式,并且不确定日期字符串的外观,那么还有其他选择:

Ole V.V.在他的答案中建议一个很好的技巧,您的解决方案可以像这样:

1
LocalDateTime ldt = LocalDateTime.parse(date.replace(' ', 'T'));

请注意,您不需要DateTimeFormatter,因为它使用默认格式LocalDateTime

完整解决方案:

1
2
3
4
5
6
String[] dates  = {"2019-12-23 12:40:43.775936","2019-12-23 12:40:43","2019-12-23 12:40:43.888"};
for (String date: dates){
    LocalDateTime ldt = LocalDateTime.parse(date.replace(' ', 'T'));
    LocalDate ld = ldt.toLocalDate();
    System.out.println(ld);
}

另一种技巧,可以解决您的问题,因此,由于您正在寻找日期部分,因此可以像这样提取它:

1
LocalDate ld = LocalDate.parse(date.substring(0, date.indexOf(' ')));

全屏:

1
2
3
4
5
String[] dates  = {"2019-12-23 12:40:43.775936","2019-12-23 12:40:43","2019-12-23 12:40:43.888"};
for (String date: dates){
    LocalDate ld = LocalDate.parse(date.substring(0, date.indexOf(' ')));
    System.out.println(ld);
}

输出

1
2
3
2019-12-23
2019-12-23
2019-12-23


您可以使用具有两个模式的单个DateTimeFormatter

但是请注意这些模式的顺序,在下面的示例中,该顺序是唯一有效的顺序。

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
    String dateTimeOne ="2019-12-23 12:40:43.775936";
    String dateTimeTwo ="2019-12-23 12:40:43";
    DateTimeFormatter dtf  = DateTimeFormatter
                                .ofPattern("[yyyy-MM-dd HH:mm:ss.SSSSSS][yyyy-MM-dd HH:mm:ss]");
    LocalDateTime localDateTimeOne = LocalDateTime.parse(dateTimeOne, dtf);
    LocalDateTime localDateTimeTwo = LocalDateTime.parse(dateTimeTwo, dtf);
    ZonedDateTime zdtOne  = localDateTimeOne.atZone(ZoneId.of("Asia/Kuwait"));
    ZonedDateTime zdtTwo  = localDateTimeTwo.atZone(ZoneId.of("Asia/Kuwait"));
    System.out.println(zdtOne.toInstant().toEpochMilli());
    System.out.println(zdtTwo.toInstant().toEpochMilli());
}

输出:

1
2
1577094043775
1577094043000

我认为您应该准备两个不同的DateTimeFormatter并依赖try-catch,这很丑陋,但不像这样容易出错。

更好:使用其他答案之一或查看评论中链接的问题。