joda datetime处理首字母缩略词和显式时区

时间:2015-06-24 19:05:43

标签: java scala playframework-2.0 jodatime

我正在使用此模式尝试处理来自客户端的日期时间提交:

E MMM dd yyyy HH:mm:ss 'GMT'Z (z)

这在我当地的ubuntu机器上适用于我。我的一个朋友试图从他生产的Windows机器上提交一份表格

Wed Jun 24 2015 13:34:22 GMT-0500 (Central Daylight Time)

作为时间戳。这明显不同于我的模式 - 但我需要能够处理上面的格式并在我的ubuntu机器上适应这样的日期:

Wed Jun 24 2015 13:42:03 GMT-0500 (CDT)

如何使用jodatime在一个模式中处理这个?

编辑:

以下是我在Playframework中使用的表单 - 它可能是相关的。

  val form  = Form(mapping(
    "beginDate" -> jodaDate("E MMM dd yyyy HH:mm:ss 'GMT'Z (z)"),
    "endDate" -> jodaDate("E MMM dd yyyy HH:mm:ss 'GMT'Z (z)")) )

3 个答案:

答案 0 :(得分:2)

JavaScript日期对象(Date.prototype.toString)的字符串化版本取决于实现,可能差异很大,不应该使用。

最强大的方法是从客户端返回协调世界时(UTC)。这也没有任何时区问题。替换以下内容:

new Date()

使用:

new Date().getTime();    

(有关该行的更多信息,请参阅此SO thread。)

然后你可以把这个时代作为一个龙:

val form  = Form(mapping(
  "beginDate" -> longNumber,
  "endDate" -> longNumber
)

如果您愿意,可以添加verifying进行验证,例如:

... longNumber.verifying("Invalid date", _ > DateTime.now().minusYears(2).getMillis)

然后在您的bindFromRequest(或者您正在接收数据的任何地方),您可以执行以下操作:

new DateTime(data.beginDate)

,它会生成您想要的DateTime

无论你的朋友在东京还是纽约,都应该是完美的。 :)

答案 1 :(得分:1)

您可以使用DateTimeFormatterBuilder使用聚合格式构建解析器。如果一个失败,它会尝试用下一个解析它。

答案 2 :(得分:0)

您可以使用Apache DateUtils Parsedate方法 -

https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html#parseDate%28java.lang.String,%20java.lang.String[]%29

要格式化日期,我们需要对它的格式有一个很好的了解。所以带有模式列表的parseDate可用于将日期格式化为字符串。