补偿Moment.js中的utcOffset
Compensate for utcOffset in Moment.js
首先我希望这不是重复的。我读过很多类似的问题,但找不到一个与这个特定问题有关的问题。
我有一个javascript日期选择器,它在内部使用javascript日期,这会产生意想不到的副作用。当我选择2016年4月30日时,它会返回该日期午夜(00:00)的日期对象,但如果您在不同的时区,并且它在内部使用UTC,它将返回一个补偿您的UTC偏移的对象。所以,因为这里是英国夏令时,我回来的日期是4月30日00:00 GTM+1:00,当你把它变成ISO字符串时,实际上是4月29日23:00。
我想把正确的日期(4月30日,没有时间)发送回服务器,但我目前在做这件事时得到的日期字符串:
var newDate = moment(newValue).toISOString();
console.log(newDate);
这是吗
2016-05-19T23:00:00.000Z
所以,我对此的理解很弱,但我认为日期选择器最初使用我的本地时间偏移量来休息一个小时,如果在内部存储19日23:00作为UTC日期,那么它已经是UTC日期了,转换为UTC没有帮助。
我需要做的是使用moment.js来补偿utcOffset,并将日期移动到我选择的UTC日期的午夜。
您在这里看到的是JS Date对象和MomentJS在内部都包含一个以毫秒为单位的Unix时间戳。这些时间戳是对全局时间线上某个点的引用,如果需要,可以将其转换为本地时间。
当您使用默认的moment()
构造函数时,您告诉Moment在"本地"模式下操作。这意味着,当Moment显示其包含的日期时,它将从内部包含的UTC Unix时间戳转换为用户的本地时间。
如果你想保留UTC时间(你没有),你可以把从日期选择器中得到的JS Date对象传递给moment.utc()
函数,然后当你在那一刻调用.format()
时,你总是会看到UTC时间。
举个例子,我现在在美国中部夏令时,偏移量为-5。
如果我以UTC时间戳为例,并将其传递给默认时刻构造函数,我会得到以下内容:
moment('2016-05-19T23:00:00.000Z').format()
"2016-05-19T18:00:00-05:00"
如您所见,出于显示目的,Moment已转换为我的本地时区。
如果我使用UTC:
moment.utc('2016-05-19T23:00:00.000Z').format()
"2016-05-19T23:00:00+00:00"
没有变化。
你不需要担心你在评论中所说的时钟变化。由于您的日期选择器在全局时间线上为您提供了一个精确的点,所以时刻总是能够正确地转换为本地时间。
至于为什么.toISOString()
在JS date对象上调用它时总是给你一个UTC日期,你可以感谢TC39委员会。根据ES2015规范,它应该是这样工作的:http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.toisostring
Moment还总是为.toISOString()
提供UTC,以便与本地日期的工作方式保持一致。
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 可以't让我的if语句处理js中的html表单输入
- 引用对象中的通用值
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 用程序搜索JQuery数据表中的文本
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 不能从angular2中的子组件指定父组件中的数组
- Dojo不解析自定义小部件的模板html中的小部件声明性
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 正在验证8个真/假复选框或复选框中的2个
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 如何更改bigquery API中的计费层选项
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- 我如何找到一个句子中的所有空格并替换忽略它们
- zurb基础中的固定宽度立柱3
- 补偿Moment.js中的utcOffset