字符串到日期转换mm / dd / yy到java中的YYYY-MM-DD

我想将mm / dd / yy格式的String值转换为YYYY-MM-DD Date。 怎么做这个转换?

输入参数为: 03/01/18

下面给出了将String转换为Date的代码

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" 

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

要转换为日期,

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

要以其他格式打印出来,

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

你写的是错误的方式。 实际上,对于要转换的日期,您需要编写SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yy");

您传递给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; } 

针对上述问题的解决方案

  1. 将格式为“dd / mm / yy”的字符串日期值转换为日期。
  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; } 

编辑:你的问题说“字符串值格式为mm / dd / yy”,但我从你的评论中了解到你的意思是“我的输入格式是dd / mm / yy as string”,所以我改变了格式模式字符串因此在下面的代码中。 否则,两种情况下的代码都是相同的。

 public static Optional 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年1月3日

我建议你远离SimpleDateFormat 。 它已经过时了,而且非常麻烦。 和Date一样过时了。 而是使用java.time LocalDateDateTimeFormatter ,即现代Java日期和时间API。 与它合作真是太好了。 LocalDate是一个没有时间的日期,所以这比Date更好地满足您的要求,尽管它的名字是一个时间点。 LocalDate.toString()生成您所需的格式(尽管LocalDate中没有格式)。

我的方法将你的2位数年份解释为2000年,即从2000年到2099年。在决定这是你想要的之前,请三思而后行。

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

您的代码出了什么问题?

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

链接

  • Oracle教程:Date Time解释了如何使用java.time