【问题标题】:Format date in yyyy-MM-dd hh:mm:ss format from whatever format从任何格式以 yyyy-MM-dd hh:mm:ss 格式格式化日期
【发布时间】:2020-10-23 18:14:20
【问题描述】:

我有各种日期字符串,并想使用 java 以特定格式格式化

String arr[] = {"Jul 02,2020 ","15-10-2015 10:20:56","2015/10/26 12:10:39","27-04-2016 10:22:56","April 7, 2020"};
    Arrays.asList(arr).forEach(date->{
        try {
            System.out.println(convertDate(date, "yyyy-MM-dd hh:mm:ss"));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    });

public static String getDateString(String date,String patternStr) throws ParseException {
    if(StringUtils.isNotEmpty(date)&& StringUtils.isNotEmpty(patternStr)) {
        SimpleDateFormat pattern = new SimpleDateFormat(patternStr);
        Date dateObject =new Date(date);
        return pattern.format(dateObject).toString();
    }
    return date;
}

但是我得到了一些日期值的解析异常。是否有任何通用方法来支持所有 input date value

【问题讨论】:

  • 要从“某事 A”到“B”,您需要知道“某事 A”实际上是什么格式,否则您将失去确保有效对话所需的上下文。解决此类问题的“常见”方法是拥有一个“可接受的输入格式”的“列表”,然后您将获取每个项目并尝试根据该“可接受的输入格式”列表对其进行解析,直到您得到一个成功的结果,或者你用完了“可接受的输入格式”,这将代表你需要决定如何处理的边缘情况
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateTimeDateTimeFormatter。即使你坚持使用Date,你仍然应该远离Date(String) 构造函数。它自 1997 年以来已被弃用,因为它跨时区运行不可靠。
  • 对于哪些字符串,您得到了不正确的结果?在这些情况下,预期的输出是什么?和观察到的输出?当询问不能按预期工作的代码时,请始终提供此信息。
  • @VictorS 虽然 Joda-Time 将是向前迈出的一大步,但我们可以通过转移到 java.time, the modern Java date and time API 来进一步迈出这一步。 Joda-Time 不再进一步开发,已被 java.time 正式取代。

标签: java date datetime datetime-format


【解决方案1】:

我建议您从过时且容易出错的 java.util 日期时间 API 切换到 rich set of modern date-time API。使用DateTimeFormatterBuilder,您可以构建一个格式,包括所有预期的日期时间格式和小时、分钟、秒,默认为0

演示

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;

public class Main {
    public static void main(final String[] args) {
        String arr[] = { "Jul 02,2020 ", "15-10-2015 10:20:56", "2015/10/26 12:10:39", "27-04-2016 10:22:56",
                "April 7, 2020" };
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                                        .appendPattern("[MMM d,yyyy]")
                                        .appendPattern("[dd-MM-yyyy HH:mm:ss]")
                                        .appendPattern("[yyyy/MM/dd HH:mm:ss]")
                                        .appendPattern("[dd-MM-yyyy HH:mm:ss]")
                                        .appendPattern("[MMMM d, yyyy]")
                                        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                                        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                                        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                                        .toFormatter();

        for (String s : arr) {
            LocalDateTime ldt = LocalDateTime.parse(s.trim(), formatter);
            System.out.println("LocalDate#toString: " + ldt + ", " + "Formatted: "
                    + ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
    }
}

输出:

LocalDate#toString: 2020-07-02T00:00, Formatted: 2020-07-02 00:00:00
LocalDate#toString: 2015-10-15T10:20:56, Formatted: 2015-10-15 10:20:56
LocalDate#toString: 2015-10-26T12:10:39, Formatted: 2015-10-26 12:10:39
LocalDate#toString: 2016-04-27T10:22:56, Formatted: 2016-04-27 10:22:56
LocalDate#toString: 2020-04-07T00:00, Formatted: 2020-04-07 00:00:00

【讨论】:

  • 这是一种更加模块化和高效的方法。到目前为止,许多文章都记录了 SimpleDateFormat 是出了名的容易出错。此处的 DateTimeFormatterBuilder 仅创建一个实例来处理多种模式,并增加了可读性。
【解决方案2】:

你不可能做到这一点。对于每个 Date string ,您需要将模式连同它一起传递。否则,您必须构建自己的字符串解析器,这可能既丑陋又麻烦。

首先,接受 String 的构造函数在 JDK 1.1 版中已弃用,由 DateFormat.parse(String s) 取代。

查看doc

从字符串中解析日期的正确方法是:

String sDate1="31/12/1998";  
Date date1=new SimpleDateFormat("dd/MM/yyyy").parse(sDate1);

【讨论】:

    猜你喜欢
    • 2019-10-15
    • 2015-11-03
    • 1970-01-01
    • 2013-11-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多