如何即时输出日期/时间而无时区偏移

时间:2019-11-19 17:08:13

标签: javascript timestamp momentjs

我有一个来自后端的时间戳,我想在每个console.log()中使用momentjs进行显示,而不进行时移,并且完全不依赖于我的浏览器时区。我阅读了许多关于stackoverflow的文章,但没有任何效果。我所有的输出都包含一些时区。

let timestamp = "2019-11-19T07:05:00+01:00";
console.log(moment(timestamp).toISOString(true));
console.log(moment.utc(timestamp).format());
console.log(moment.utc(timestamp).toISOString(true)); 
console.log(moment.parseZone(timestamp).format());
console.log(moment.parseZone(timestamp).local().format());
console.log(moment.parseZone(timestamp).utc().format());
console.log(moment(timestamp).utcOffset(timestamp).toISOString(true));
console.log(moment.tz(timestamp, 'Europe/Berlin').toISOString(true));
console.log(moment.tz(timestamp, 'Europe/Berlin').format());
console.log(moment.tz(timestamp, 'Europe/Berlin').unix());
console.log(moment.parseZone(timestamp).format('MM/DD/YYYY HH:mm:ss'));
console.log(moment(timestamp).utcOffset("+0100").format('YYYY-MM-DD hh:mm:ss'));

预期输出: 2019-11-19T07:05:00Z 时间戳记的时区是:欧洲/柏林 我的浏览器时区切换为其他时间。 我不明白为什么这个简单的问题没有简单的解决方案。 :)

1 个答案:

答案 0 :(得分:1)

要满足您描述的要求(在更改偏移量的同时保留本地时间),可以执行以下操作:

var result = moment.parseZone("2019-11-19T07:05:00+01:00").utcOffset(0, true).format();
console.log(result); //=> "2019-11-19T07:05:00Z"
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

逐步解释:

moment.parseZone("2019-11-19T07:05:00+01:00") // Parses the string, retaining the offset provided
      .utcOffset(0, true)  // sets the offset to zero while keeping the local time
      .format()            // formats the output, using Z to represent UTC

但是-您应该认识到这些时刻不是同一时刻。输出时间戳比输入时间戳早一小时。 in the documentation的解释如下(强调我的意思):

  

utcOffset函数具有一个可选的第二个参数,该参数   接受一个布尔值,该值指示是否保留现有时间   一天。

     
      
  • 传递false(默认设置)会在世界标准时间保持不变,但本地时间会改变。

  •   
  • 传递true会保留相同的本地时间,但会牺牲在世界标准时间中选择其他时间点的代价

  •   

因此,当您已经具有特定时间点(采用UTC或相对于UTC的偏移量(如示例输入值))时,通常这是错误的选择。

相反,您应该期望从本地时间转换为UTC确实会更改时间戳的日期和时间部分。您可以使用.utcOffset(0, false).utcOffset(0),也可以使用.utc()正确地进行转换。