【问题标题】:String to Date Conversion mm/dd/yy to YYYY-MM-DD in java [duplicate]java中的字符串到日期转换mm / dd / yy到YYYY-MM-DD [重复]
【发布时间】:2018-05-18 06:39:09
【问题描述】:

我想将 mm/dd/yy 格式的字符串值转换为 YYYY-MM-DD 日期。如何进行这种转换?

输入参数为:03/01/18

下面给出了将字符串转换为日期的代码

public static Date stringToDateLinen(String dateVlaue) {
    Date date = null;
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    try {

        date = formatter.parse(dateVlaue);

    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;
}

当尝试使用此方法进行转换时,它会显示以下错误

java.text.ParseException: Unparseable date: "03/01/18"

【问题讨论】:

  • 只需检查您输入的日期和您使用的日期格式,它们是否匹配?自己尝试,不要寻找答案
  • 我们很清楚,Date 没有格式的概念,它只是 Unix 纪元以来毫秒数的容器。为了克服您的“错误”,解析的格式需要与输入相同
  • 我建议你避免使用SimpleDateFormat 类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 的表现要好得多。
  • 作为 Ole V.V.评论说,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代。见Tutorial by Oracle

标签: java


【解决方案1】:

正如您所说的输入格式不同,首先将 String 转换为有效的 Date 对象。拥有 Date 对象后,您可以根据需要将其格式化为不同的类型,check

转换为日期,

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yy");
date = formatter.parse(dateVlaue);

要以其他格式打印出来,

SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");
dateString = formatter1.format(date)

【讨论】:

  • 感谢您的提示,我得到了预期的输出
【解决方案2】:

你写错了。事实上,对于你要转换的日期,你需要写 SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yy");

【讨论】:

    【解决方案3】:

    您传递给 SimpleDateFormat 的格式是 ("yyyy-MM-dd"),它期望日期为 2013-03-01 格式,因此会出现错误。

    您需要提供正确的格式来传递您的输入,如下所示

    public static Date stringToDateLinen(String dateVlaue) {
        Date date = null;
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yy");
    
        try {
    
            date = formatter.parse(dateVlaue);
    
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    

    【讨论】:

      【解决方案4】:

      上述问题的解决方案

      1. 将格式为“dd/mm/yy”的String日期值转换为Date。
      2. 通过使用转换后的日期可以框出所需的日期格式。

      下面给出的方法

      public static String stringToDateLinen(String dateVlaue) {
          Date date = null;
          SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yy");
          String dateString = null;
          try {
              // convert to Date Format From "dd/mm/yy" to Date
              date = formatter.parse(dateVlaue);
              // from the Converted date to the required format eg : "yyyy-MM-dd"
              SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");
              dateString = formatter1.format(date);
      
          } catch (ParseException e) {
              e.printStackTrace();
          }
          return dateString;
      }
      

      【讨论】:

      • 感谢分享您的解决方案!还是不行,抱歉。我以为 03/01/18 表示 3 月 1 日,但你的方法返回 2018-01-03,即 1 月 3 日。如果我喂它12/24/18,我得到2018-01-12,月份是01 每次. 24/12/18 变为 2018-01-24
      • 实际需要的输出格式是YYY-MM-DD,但我的输入格式是dd/mm/yy as string
      • dd/mm/yy 不同意您的问题。你可能想edit the question说清楚。
      • 我已经编辑了我的答案以反映
      【解决方案5】:

      编辑:您的问题是“mm/dd/yy 格式的字符串值”,但我从您的 cmets 了解到您的意思是“我的输入格式是 dd/mm/yy 作为字符串”,所以我相应地更改了以下代码中的格式模式字符串。否则两种情况下的代码都是一样的。

      public static Optional<LocalDate> stringToDateLinen(String dateValue) {
          DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yy");
          try {
              return Optional.of(LocalDate.parse(dateValue, dateFormatter));
          } catch (DateTimeParseException dtpe) {
              return Optional.empty();
          }
      }
      

      试试看:

          stringToDateLinen("03/01/18")
                  .ifPresentOrElse(System.out::println, 
                          () -> System.out.println("Could not parse"));
      

      输出:

      2018-01-03

      我建议你远离SimpleDateFormat。它早已过时并且出了名的麻烦。而Date 也同样过时。而是使用现代 Java 日期和时间 API java.time 中的 LocalDateDateTimeFormatter。与它一起工作要好得多。 LocalDate 是一个没有时间的日期,因此它比 Date 更适合您的要求,尽管它的名称是一个时间点。 LocalDate.toString() 生成的格式正是您所说的所需格式(尽管 LocalDate 没有格式)。

      我的方法将您的 2 位数年份解释为基于 2000 年,即从 2000 年到 2099 年。请三思而后行,然后再决定这是您想要的。

      如果无法将字符串解析为有效日期,您希望发生什么?恐怕返回 null 是一个等待发生的 NullPointerException 以及随后的调试会话以追踪根本原因。您可以考虑让 DateTimeParseException 从您的方法中抛出(只需在 Javadoc 中声明),因此根本原因在于堆栈跟踪。如果这种情况不应该发生,甚至可以抛出AssertionError。在我的代码中,我返回了一个Optional,它清楚地向调用者表明可能没有结果,这(我希望)可以防止任何NullPointerException。在调用该方法的代码中,我使用的是 Java 9 中引入的 ifPresentOrElse 方法。如果尚未使用 Java 9,请使用 ifPresent 和/或阅读有关在其他地方使用 Optional 的更多信息。

      你的代码出了什么问题?

      其他答案是正确的:您用于解析的格式模式字符串需要匹配输入(而不是您的输出)。 ParseException 被抛出,因为格式模式包含连字符和输入斜杠。遇到异常很好,因为另一个问题是年月日的顺序不匹配,年份的位数也不匹配。

      链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-25
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        相关资源
        最近更新 更多