繁体   English   中英

Joda时间:如何将String转换为LocalDate?

[英]Joda time : How to convert String to LocalDate?

如何指定格式字符串以仅从字符串转换日期。 就我而言,只有日期部分是相关的

将其构造为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 (或其他东西,如果这不是正确的表示)

谢谢...

您可能正在寻找LocalDate(Object) 它有点令人困惑,因为它需要一个通用的Object ,但文档表明,如果你将一个String传递给构造函数,它将使用一个知道如何处理StringConverterManager ,例如

LocalDate myDate = new LocalDate("2010-04-28");

使用parse(String)方法。

LocalDate date = LocalDate.parse("2009-04-17");

使用LocalDate.parse()new LocalDate()有一个微妙的bug问题。 代码片段胜过千言万语。 在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年返回日期更为明智。

在我的例子中,传入的字符串可以是两种格式之一。 所以我首先尝试用更具体的格式解析字符串:

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"));
}

这对我有用:

LocalDate d1 = LocalDate.parse("2014-07-19");
LocalDate dNow = LocalDate.now();  // Current date

您可以将LocalDate.of与作为单独参数传递的年,月和日一起使用:

LocalDate date1 = LocalDate.of(2009, 4, 17);
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM