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 |
输出
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')); |
请注意,您不需要
完整解决方案:
1 2 3 4 5 6 |
另一种技巧,可以解决您的问题,因此,由于您正在寻找日期部分,因此可以像这样提取它:
1 | LocalDate ld = LocalDate.parse(date.substring(0, date.indexOf(' '))); |
全屏:
1 2 3 4 5 |
输出
1 2 3 | 2019-12-23 2019-12-23 2019-12-23 |
您可以使用具有两个模式的单个
但是请注意这些模式的顺序,在下面的示例中,该顺序是唯一有效的顺序。
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 |
我认为您应该准备两个不同的
更好:使用其他答案之一或查看评论中链接的问题。