【问题标题】:How do I fix the time difference between MomentJS and Asp.net Core如何修复 MomentJS 和 Asp.net Core 之间的时差
【发布时间】:2017-05-02 18:42:09
【问题描述】:

我在我的 UI 中通过这个 angularjs date picker 设置了一个日期。它被设置为 moment.js 对象,它包括我的时区(东部)的 GMT 偏移量。当我将时刻对象提交回我的 Asp.net Core 端点时,时间将转换为没有偏移的时间。因此,例如,当我在 javascript 时刻对象对象中检查日期时:

timeIn: Fri Dec 16 2016 05:00:00 GMT-0500 (Eastern Standard Time)

当我在 .net core 中检查我的对象时:

TimeIn: 12/16/2016 10:00:00AM

我希望后端的数据显示为在 UI 上输入的确切时间,而不考虑时区。因此,如果他们进入上午 5:00,则后端应存储的时间为上午 5:00。当 moment 对象转换为 JSON 以发送到后端时,它似乎会更改值。当我在 UI 上对我的 timeIn 对象执行 JSON.stringify() 时,我得到:

"2016-12-16T10:00:00.000Z"

有没有办法从前端的时区中剥离偏移数据,以便输入的时间与发送的时间完全相同?

附:我知道有很多关于时间的问题,但我无法找到适合我的情况的问题。感谢您的帮助

编辑:我正在使用 .net DateTime 对象来接受 javascript 日期对象。

【问题讨论】:

  • 如果您切换到 DateTimeOffset,您的生活会变得更轻松。
  • 我相信 DateTimeOffset 标识了一个时间点,因此它会考虑时区。例如,如果用户输入凌晨 5 点的 timeIn 并且他们在太平洋时区,然后东部时区的主管查看该时间条目,我的应用程序应该向主管显示早上 5 点,而不是早上 8 点.我需要输入的时间向任何用户显示相同的时间,无论他们在哪个时区。

标签: javascript asp.net angularjs asp.net-core


【解决方案1】:

此格式包含 5 个空格:

Fri Dec 16 2016 05:00:00 GMT-0500 (Eastern Standard Time)

我们可以假设20 是当年登陆的最低安全入口。获取下一次出现的空格字符并从那里拆分。

注意:这个完全基于假设,但看起来效果更好。

你可以这样做:

var time = "Fri Dec 16 2016 05:00:00 GMT-0500 (Eastern Standard Time)";
console.log(time.substr(0, time.indexOf(" ", 20)));

另外,参考How to get the nth occurrence in a string?,我们可以做得更好。

function getPosition(string, subString, index) {
   return string.split(subString, index).join(subString).length;
}

我们需要第 5 次出现的空格:

function getPosition(string, subString, index) {
   return string.split(subString, index).join(subString).length;
}
var time = "Fri Dec 16 2016 05:00:00 GMT-0500 (Eastern Standard Time)";
console.log(time.substr(0, getPosition(time, " ", 5)));

第二种方法似乎比第一种更好。

第三种方法是使用Moment.js库将时间格式化成.Net接受的格式:

timeIn = timeIn.format('MM-DD-YYYY h:mm:ss');

【讨论】:

  • 看起来确实有效。我找到了另一种使用 moment.js 库的方法。 timeIn = timeIn.format('MM-DD-YYYY h:mm:ss');这种格式被 .net 接受并且也可以正常使用。
  • @big_water 太棒了...:D 你想把它添加到我的答案中并接受吗?你的愿望...:)
  • 我会这样做的!虽然我不认为 moment.js 库会在 sn-p 中运行,除非你知道方法?
  • @big_water 它运行伙伴。好的,那我自己加吧。
  • 无意冒犯,但是您是否完全疯了才能发布这样的解决方案?这完全是错误的。发送到服务器的时间是正确的日期,它是Fri Dec 16 2016 05:00:00 GMT-0500 的UTC 表示,这是绝对正确的。您实际上所做的是,切断时区并且发送到服务器的时间实际上比实时时间差 5 小时(在这种情况下),这将完全弄乱日期。在格林威治标准时间 5:00 发布内容的人将出现在格林威治标准时间 8:00 -1 发​​布的人“之前”,即使“格林威治标准时间 8:00 -1”明显比“格林威治标准时间 5:00-”早 1 小时5 英寸。
猜你喜欢
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2020-03-12
  • 1970-01-01
  • 2022-11-10
相关资源
最近更新 更多