字符串到日期转换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; }
针对上述问题的解决方案
- 将格式为“dd / mm / yy”的字符串日期值转换为日期。
- 通过使用转换后的日期,可以构建所需的日期格式。
该方法如下
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
LocalDate
和DateTimeFormatter
,即现代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
。