我有一个来自后端的时间戳,我想在每个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 时间戳记的时区是:欧洲/柏林 我的浏览器时区切换为其他时间。 我不明白为什么这个简单的问题没有简单的解决方案。 :)
答案 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()
正确地进行转换。