【问题标题】:Selecting Date format based on the string [duplicate]根据字符串选择日期格式[重复]
【发布时间】:2017-11-02 06:22:06
【问题描述】:

我有一个类从其他类接收字符串格式的日期。它现在接收两种不同的格式

格式一:YYYY_MM_DD

格式2:EEE MMM dd HH:mm:ss z yyyy

现在我想编写一个方法来接收这个字符串并将其转换为所需的格式,例如 'DDMMMYYYY'

【问题讨论】:

  • 你的意思是可以处理format1和format2然后结果为DDMMMYYYY的方法吗??
  • @ΦXocę웃Пepeúpaツ 是的,正是
  • 我更喜欢使用两个 DateTimeFormatter 对象。尝试使用其中一个解析为LocalDate,如果抛出DateTimeParseException,则使用另一个解析。最后使用第三个格式化成所需的格式。请记住:年份是小写 yyyyuuuu,月份中的日期是小写 dd。并为您的格式化程序提供适当的语言环境。
  • 我同意这个问题是重复的。如何从可能有两种或三种不同格式的字符串中解析日期之前已经多次被问及回答。对于这个问题与哪个问题的重复,我不敢苟同。

标签: java datetime date-format date


【解决方案1】:

您可以尝试蛮力解析捕获异常:

编辑:

使用 java8 API(根据需要/想要调整格式)

public   String convertDateFormatJ8(String format) {
    String retFormat = "ddMMyyy";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy_dd_MM][yyyy-MM-dd HH:mm]");
    try {
        LocalDateTime localDate = LocalDateTime.parse(format, formatter);
        return localDate.format(DateTimeFormatter.ofPattern(retFormat));
    } catch (DateTimeParseException ex) {
        System.err.println("impossible to parse to yyyy-MM-dd HH:mm");
    }
    try {
        LocalDate localDate = LocalDate.parse(format, formatter);
        return localDate.format(DateTimeFormatter.ofPattern(retFormat));
    } catch (DateTimeParseException ex) {
        System.err.println("impossible to parse to yyyy_dd_MM");
    }

    return null;

}

对于旧的 java 版本

public String convertDateFormat(String format) {
        DateFormat df1 = new SimpleDateFormat("YYYY_MM_DD");
        DateFormat df2 = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
        DateFormat dfResult = new SimpleDateFormat("DDMMMYYYY ");
        Date d = null;
        try {
            d = df1.parse(format);
            return dfResult.format(d);
        } catch (ParseException e) {
            System.err.println("impossible to parse to " + "YYYY_MM_DD");
        }
        try {
            d = df2.parse(format);
            return dfResult.format(d);
        } catch (ParseException e) {
            System.err.println("impossible to parse to " + "EEE MMM dd HH:mm:ss z yyyy");
        }
        return null;
    }

如果你给出任何其他无效字符串,返回的字符串将为空!

【讨论】:

  • 您错过了第三个 DateFormat 将日期转换为 DDMMMYYYY 之类的字符串 ;-)
  • 神圣模式,谢谢!!
  • 请不要教年轻人使用过时的SimpleDateFormat和朋友。今天我们已经好多了。参见例如Andriy Rymar’s answer
【解决方案2】:

您可以使用这种方法并在模式中声明可选部分:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy_MM_dd][EEE MMM dd HH:mm:ss Z yyyy]", Locale.ENGLISH);

formatter 将解析两种模式的日期,然后您可以轻松地将其转换为所需的格式。

附:我已经对其进行了测试,但不确定EEE MMM dd HH:mm:ss Z yyyy 模板应该可以解析哪个日期。因此,只需使用它并使用 Java 8 方法(Java Time)

【讨论】:

  • Here is解释如何使用它。
  • 在格式模式字符串中,第一种格式应写为 yyyy_MM_dd,小写 y 和 d(大写 Y 表示基于周的年份,仅对周数有用;大写 D 表示一年中的某天)。
  • @AndriyRymar 饰演 Ole V.V.评论说,您在此答案中的代码是非常损坏的。请修复或删除。
  • @OleV.V. ,是的,对不起,我只是从问题中使用用户格式,并且有大写字母。我的观点是在模式中使用带有可选部分的 Java 8 方法。它将降低代码复杂性并成为通用方法。
  • @BasilBourque,已修复,谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-05-09
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
相关资源
最近更新 更多