【问题标题】:Make local 24h day from utc timestamp, and convert back to utc从 utc 时间戳制作本地 24 小时,然后转换回 utc
【发布时间】:2017-09-27 08:41:57
【问题描述】:

我有UTC日期2017-04-22T21:03:54(本地日期是2017-04-23 00:03:54,偏移+3)

我想从服务器获取 1 天的数据。对于这个例子,当地时间是:

start: 2017-04-23 00:00:00
end: 2017-04-23 23:59:59

服务器的 UTC 参数:

start: 2017-04-22 21:00:00
end: 2017-04-23 20:59:59

如何使用 moment.js 接收此日期?局部偏移量可能不同

我试试:

moment.utc(startTime).format() // 2017-04-22T21:03:54Z, but I need 2017-04-22T21:00:00Z
// for example, if local timezone will be +6, I need 2017-04-22T18:00:00Z

【问题讨论】:

  • 服务器的 UTC 参数应该是 ISO 8601 并且服务器代码应该将它们解析为 ISO 8601。
  • @RemusRusanu utc 参数用于服务器 - 这不是问题。我不明白,如何将 UTC 日期转换为具有偏移量的本地日期并设置 24 小时开始/结束参数。
  • 1) 您的后端服务器应始终以 UTC 存储时间,不应在服务器上转换为本地时间。 2)你从来没有提到你的后端堆栈是什么。但是在我所知道的每一种语言/库中,解析 ISO 并转换为本地语言都很简单。
  • moment.utc('2017-04-22T21:00:00Z').local().toDate()
  • @RemusRusanu local() 是我正在寻找的方法!谢谢。

标签: javascript date datetime momentjs


【解决方案1】:

(以我的 cmets 为答案)

  • 文本编码传输/协议(如 HTTP)中的日期时间表示应遵循 ISO-8601。时间部分应包含时区指示符(对于 UTC 时间,这是简单的 Z,请参阅链接)。这些约定消除了客户端和服务器之间关于时间文字代表什么时刻的任何歧义。
  • 后端应以 UTC 格式存储时间:
    • 这消除了数据库移动时的任何歧义(故障转移到不同时区的备用服务器,将服务器从东海岸移动到西海岸的新位置等)。
    • 它消除了属于 DST 时间 overlaps 的文字的任何歧义。
    • 它消除了修改时区的匆忙立法变更中的任何歧义(其中几次每隔几年发生一次)

话虽如此,如果您需要使用 MomentJS 在 JavaScript/Node 中将 UTC 时间转换为本地时间,请使用 Moment 的local()

【讨论】:

    【解决方案2】:

    我有 UTC 日期 2017-04-22T21:03:54

    没有时区的日期字符串被视为本地日期(ISO 8601 仅日期格式除外,ECMAScript 将其视为 UTC,这与 ISO 8601 相反)。如果您想将像“2017-04-22 21:00:00”这样的字符串视为UTC,那么您必须告诉解析器(在moment.js中您可以使用utc方法)。

    您还应该始终告诉解析器它试图解析的格式,否则您希望它猜对了。如果使用 utc,moment 默认使用偏移量 +0000(它的 "UTC mode" * ),而不是本地偏移量。如果你想要主机偏移,你可以使用 local 方法或转换为 Date 对象并使用内置方法。

    var s = '2017-04-22 21:00:00';
    var format = 'YYYY-MM-DD HH:mm:ss';
    
    // Tell parser to treat as UTC and the format
    var m = moment.utc(s, format);
    
    // Once the string has been parsed, you can output it in any format you like
    console.log(
         'Original format, offset +0000 : ' + m.format(format)
      +'\nBuilt-in toISOString, offset Z: ' + m.toDate().toISOString()
      +'\nBuilt-in toString, host offset: ' + m.toDate().toString()
      +'\nOriginal format, host offset  : ' + m.local().format(format)
    );
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

    * 我不确定这是一个好主意,因为这意味着使用该对象的代码需要知道它处于 UTC 模式。如果您从其他地方获得 moment.js 对象,最好将其设置为您想要的“模式”。多次调用 localutc 没有不良影响。

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2019-03-09
      • 1970-01-01
      • 2019-01-05
      • 2013-03-23
      • 2015-04-20
      • 2011-02-06
      • 2018-05-23
      • 2013-09-12
      相关资源
      最近更新 更多