【问题标题】:joda datetime handle both acronym and explicit timezonesjoda datetime 处理首字母缩写词和显式时区
【发布时间】:2023-03-08 11:00:01
【问题描述】:

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

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

【问题讨论】:

  • 这是提交时间字段的表单吗?
  • 是的——特别是使用 Scala Playframework

标签: java scala playframework-2.0 jodatime


【解决方案1】:

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

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

new Date()

与:

new Date().getTime();    

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

那么你就可以把epoch当成Long了:

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

喜欢的可以加verifying进行验证,例如:

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

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

new DateTime(data.beginDate)

这将产生您想要的DateTime

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

【讨论】:

  • 这不起作用,我进行了您想要的更改,因此我的输入现在填充了像这样的数字 1435367479841 并且我在提交表单上的两个字段时仍然收到错误。我还将服务器端验证更改为"beginDate" -> jodaDate, "endDate" -> jodaDate
  • 还有,这里是Play Framework生成的错误列表List(FormError(beginDate,List(error.date),List()), FormError(endDate,List(error.date),List()))
  • 最后,我试图将这些东西绑定到 org.joda.time.DateTime 类型的东西上,而不仅仅是像 play framework 中所说的 jodaDate。不确定这是否重要
  • 嗨,克里斯,刚刚看了看,我很抱歉,jodaTime 映射器默认不接受时代。我将编辑我的答案。
  • 查看已编辑的答案,我已经测试过可以在这里工作。 :) 只需将 jodaTime 替换为 longNumber,然后在您的 bindFromRequest 代码中,执行新的 DateTime(data.beginDate) 以生成 jodaDate 对象。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你可以使用 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 将日期格式化为字符串。

    【讨论】:

    • 它来自 javascript 的 new Date 函数。然后使用 jquery ala $("#dateInput").val(new Date()) 将该日期放入输入字段
    • 酷。所以要在服务器端解析它,你可以使用这个方法。对吗?
    • 我不能。我正在使用构建表单的框架。我需要 ONE 1 org.joda.time.format.DateTimeFormat 来定义我的模式
    • 也有点困惑,看起来我上面提供的模式应该可以工作,因为z 代表明确拼写或缩写的时区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多