如何指定格式字符串以仅从字符串转换日期。就我而言,只有日期部分是相关的
将其构建为DateTime
失败:
String dateString = "2009-04-17";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = formatter.parseDateTime(dateString);
错误java.lang.IllegalArgumentException: Invalid format: "2011-04-17" is too short
可能是因为我应该使用LocalDate
代替。但是,我没有看到LocalDate
的任何格式化程序。将String dateString = "2009-04-17";
转换为LocalDate
的最佳方式是什么(如果不是正确的代表,则为其他内容)
感谢...
答案 0 :(得分:52)
你可能正在寻找LocalDate(Object)
。这有点令人困惑,因为它需要通用Object
,但文档表明,如果您将String
传递给String
,它会使用知道如何处理LocalDate myDate = new LocalDate("2010-04-28");
的{{3}}构造函数,例如
{{1}}
答案 1 :(得分:19)
使用parse(String)
方法。
LocalDate date = LocalDate.parse("2009-04-17");
答案 2 :(得分:9)
使用LocalDate.parse()
或new LocalDate()
时会出现一些微妙的错误问题。代码片段胜过千言万语。在scala repl的以下示例中,我希望以字符串格式yyyyMMdd获取本地日期。 LocalDate.parse()
很高兴为我提供LocalDate的实例,但它不是正确的(new LocalDate()
具有相同的行为):
scala> org.joda.time.LocalDate.parse("20120202")
res3: org.joda.time.LocalDate = 20120202-01-01
我以2016年2月2日的格式给出了yyyyMMdd的格式,我得到了20120202年1月1日的日期。我在这里走出困境:我不认为这应该是它应该做的。 Joda使用'yyyy-MM-dd'作为默认值,但隐含地接受一个没有' - '字符的字符串,认为你想要那年的1月1日?对我来说,这似乎不是一个合理的默认行为。
鉴于此,在我看来,使用一个不容易被愚弄的joda日期格式化程序是解析字符串的更好解决方案。此外,如果日期格式不是'yyyy-MM-dd',LocalDate.parse()
应该抛出异常:
scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@56826a75
scala> org.joda.time.LocalDate.parse("20120202", format)
res4: org.joda.time.LocalDate = 2012-02-02
这将导致其他格式失败,因此您不会遇到这种奇怪的错误行为:
scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd")
format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@781aff8b
scala> org.joda.time.LocalDate.parse("20120202", format)
java.lang.IllegalArgumentException: Invalid format: "20120202" is too short
at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900)
at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844)
at org.joda.time.LocalDate.parse(LocalDate.java:179)
... 65 elided
这比在20120202年返回日期更为明智。
答案 3 :(得分:4)
在我的情况下,传入的字符串可能是两种格式之一。所以我首先尝试用更具体的格式解析字符串:
String s = "2016-02-12";
LocalDateTime ldt;
try {
ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd HH:mm"));
}
catch (IllegalArgumentException e) {
ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd"));
}
答案 4 :(得分:1)
这对我有用:
LocalDate d1 = LocalDate.parse("2014-07-19");
LocalDate dNow = LocalDate.now(); // Current date
答案 5 :(得分:1)
您可以将LocalDate.of
与年,月,日一起作为单独的参数使用:
LocalDate date1 = LocalDate.of(2009, 4, 17);
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);