从utc时间戳开始本地24小时,然后转换回utc

时间:2017-04-29 08:44:41

标签: javascript date datetime momentjs

我有utc date 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

2 个答案:

答案 0 :(得分:1)

  

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

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

您还应该始终告诉解析器它尝试解析的格式,否则您希望它能够正确猜测。如果使用 utc ,则默认使用偏移量+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对象,那么将它设置为你想要的“模式”是一个好习惯。多次调用本地 utc 没有任何不良影响。

答案 1 :(得分:1)

(把我的评论作为答案)

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

现在可以说,如果您需要使用MomentJS在UTC / Node中将UTC时间转换为本地时间,请使用Moment&#39; local()