【问题标题】:Send JavaScript date with milliseconds and timezone to Java webservice将带有毫秒和时区的 JavaScript 日期发送到 Java Web 服务
【发布时间】:2018-02-16 03:43:25
【问题描述】:

我需要将 UI 上的当前日期作为 http 请求标头发送到基于 Java 的 Web 服务,但由于 javascript new Date 方法隐藏了日期中的毫秒数据并将其转发到 Web 服务,因此面临问题。

console.log(new Date())
LOGS - Thu Sep 07 2017 14:47:37 GMT+0530 (India Standard Time)

毫秒信息不存在。但是,我需要 Java webservice 也将其视为 Date 而不是字符串的日期类型。我阅读了有关 momentjs 格式方法的信息,但它基本上返回一个字符串而不是日期。

我需要的是:Thu Sep 07 2017 15:10:46:955GMT+0530 (India Standard Time)

【问题讨论】:

  • 什么是 900100?如果你说的是毫秒,它应该只有 3 位数字。
  • @Hugo Yup 已更正!
  • momentjs 返回一个字符串而不是日期 - 阅读 this - 它谈到了 java.util.Date,但同样的概念适用于 JS 日期。 日期没有格式也没有时区信息。这只是自纪元 (1970-01-01T00:00Z) 以来的毫秒数。同一日期可以以多种形式表示(或以不同格式书写)。 console.log 只使用其中一种格式,momentjs 允许 many others,但所有格式都表示相同的日期值。
  • console.log 不显示毫秒字段,但这并不意味着它不存在。您可以调用getMilliseconds() 方法来检查它的值——只是console.log,无论出于何种原因,都没有显示它。另一个细节是它使用浏览器的时区来显示值,但日期本身也没有时区信息。无论如何,如果您要发送 http 请求标头,您可能需要将其作为字符串发送(除非您使用需要日期的库;在这种情况下,只需使用日期对象)。
  • @Hugo 非常感谢!感谢您的宝贵意见。

标签: javascript java jquery html date


【解决方案1】:

如果你对纯毫秒没问题,你可以使用这样的东西:

Date.now(); // 1504785573971

这适用于几乎所有现代浏览器。它不会告诉您用户的时区,但会为您提供一个一致的数字以供比较(自 1970 年 1 月 1 日午夜以来的毫秒数,格林威治标准时间)。

对于您寻求的非常具体的时间戳,您可能需要像 moment.js 这样的库 - 这是一个非常繁重的解决方案,但可以让您对格式进行出色的控制。

这个将是一个字符串,因为在 JSON 中传递日期并没有真正达成一致的格式。它将需要在 Java 中解析逻辑。我在 Java 方面没有太多经验,但我相信 Jackson 和 GSON 等流行的库支持这种转换。

如果您不使用 JSON 向服务器提交信息,则正常的表单提交作为字符串传递,并且无论如何都必须在服务器上解析出来。

【讨论】:

  • 时间戳不传达时区信息 - 在这种情况下为GMT+0530
  • 我需要时区和毫秒!!
  • 既然您在谈论请求标头,那么 MomentJS 应该可以很好地完成任务......它们本质上都是作为文本生成的。
  • @Manu—ECMAScript 时间值始终为 UTC,不需要时区。
【解决方案2】:

ECMAScript 日期基于自 1970-01-01T00:00:00Z 以来以毫秒为单位的时间值,因此它们本质上是 UTC。因此返回的值是:

new Date().getTime();
// or more concisely
Date.now();

不需要时区,包括毫秒精度。您还可以使用 toISOString,它返回一个以毫秒为单位的 ISO 8601 扩展日期,再次使用 UTC,例如2017-09-07T22:51:51.287Z.

ISO 格式被广泛接受,易于人类阅读且明确。

但是,如果同时传达源的时区也很重要,您可以使用时区偏移量(以分钟为单位返回以添加到本地时间以获取 UTC)并将其格式化为更标准的格式。

function getISOOffset(date) {
  date = date || new Date();
  function z(n){return ('0'+n).slice(-2)}
  var offset = date.getTimezoneOffset();

  // ECMScript offset sign is the reverse of ISO 8601
  var sign = offset < 0? '+' : '-';
  offset = Math.abs(offset);
  return sign + z(offset/60 | 0) + ':' + z(offset % 60);
}

console.log('The host offset is UTC' + getISOOffset())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    相关资源
    最近更新 更多