我通过 Ajax 调用获得了 UTC 日期,例如“/日期(1517216466000+0100)/”
,
这是打印到控制台时的情况:Mon Jan 29 2018 10:01:06 GMT+0100 (W. Europe Standard Time)
。
我需要做的是让用户更改时区:我可以轻松地使用例如moment(myDate).tz(“日本”)
。
然后我需要以 UTC 格式保存日期,但我无法做到。
我一直在尝试使用 moment.utc()
,但对于上面的输入,它返回减少 1 小时。
遇到这种情况该如何处理呢?总结一下:
1.从网络服务获取UTC时间
2.让用户更改时区
3.以UTC格式保存修改后的日期(不带时区)
工作演示:https://stackblitz.com/edit/angular-kqrct7?file=app%2Fapp.component.html
编辑澄清:
让我们看看时间。我从 WCF 得到的日期是 10 点。浏览器将其解释为 10 点钟,但采用 GMT+1,因此当我将其转换为 UTC 时,它变为 9 点钟。
我希望它是UTC 10 点。然后,如果我修改时区,例如该日期的分钟,我希望能够获取该日期的 UTC 值。
EDIT2:使我的问题更简单以供澄清
我有一个 UTC 日期,该日期是从网络服务中获取的,例如:“/Date(1517216466000+0100)/”,即:2018 年 1 月 29 日星期一 10:01:06 GMT+0100 (W.欧洲标准时间)打印到控制台时。
我用 moment(this.inputDate).tz("Europe/Berlin").format() 添加时区,但它仍然是 10:01:06,我猜是因为我的浏览器 GMT+ 1.
我希望将原始字符串用作 UTC 日期,并且它应该保留为 10:01:06,而不是 09:01:06,如您在上面看到的(第二时刻示例),因此使用时区“欧洲/柏林”将是 11:01:6
最佳答案
在 .NET JSON formatted date "/Date(1517216466000+0100)/"时区偏移量可以忽略。它表示“2018-01-29T09:01:06.000Z”,其中源系统的时区偏移量为 +0100。因此,如果您不关心源时区,请忽略它。
这也是与 2018 年 1 月 29 日星期一 10:01:06 GMT+0100(西欧标准时间)相同的时刻,只是偏移量不同。
UTC 不是一种格式,而是一种时间标准。如果您想使用 ISO 8601 格式:
- 提取第一个数值
- 转换为数字
- 传递给日期构造函数
- 对结果 Date 调用 toISOString 方法
var s = '/Date(-1517216466000+0100)/';
console.log(new Date(+s.replace(/^[^\d-]+(-?\d+).*$/,'$1')).toISOString());
您还可以使用 moment.js 对其进行解析和格式化,根据the documentation可以处理.NET JSON格式,无需指定格式。因此,您可以这样做,也可以提取时间值并使用“x”格式标记对其进行解析:
var s = '/Date(1517216466000+0100)/';
// Let moment.js guess the format
console.log(moment(s).utc());
// Extract time value and supply format
console.log(moment(s.replace(/^[^\d-]+(-?\d+).*$/,'$1'), 'x').utc());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>
关于javascript - .NET 日期、Moment.js、UTC 和时区转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48502165/