如何将Java 8中的字符串中的两个不同日期(2019-12-23 12:40:43.777和2019-12-23 12:40:43)转换为2019-12-23格式方法? [重复]

问题描述 投票:0回答:2
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均适用。请提出建议。
java datetime date-formatting java-time
2个回答
3
投票
这里不需要正则表达式,您只需要这种模式

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

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

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); }

输出

2019-12-23 2019-12-23

编辑

..上面的代码不适用于这种格式的日期:2019-12-23 12:40:43.888

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

[Ole V.V.]在他的回答中提出了一个不错的技巧,您的解决方案可以像这样:

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

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

完整解决方案:

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); }


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

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

全屏:

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); }

输出

2019-12-23 2019-12-23 2019-12-23

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

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

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()); }

输出:

1577094043775 1577094043000

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

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

© www.soinside.com 2019 - 2024. All rights reserved.