我需要这样的输出:
2017-08-11T16:11:00.000Z
我不确定这种格式是什么。似乎这种格式至少有两种变体,上面的那种和看起来像的那种:
2017-08-11 16:11:00 + 00:00
这是一回事吗?为什么有两种变体?
现在我的问题是,我正在使用Vue2,特别是我正在使用这个组件:
http://element.eleme.io/#/en-US/component/datetime-picker
当它向用户呈现日期时,此组件将以以下格式显示: 2017-08-11 18:11:00
如果我使用Vue调试器检查组件值,它会在场景后面存储,如2017-08-11T16:11:00.000Z
如果您注意到该值实际上是2小时的偏移,我猜这个vue组件会根据用户选择的内容和用户时区在内部以UTC时间存储值吗?
当我向他询问组件中存储的格式值时,我收到了此组件创建者的回复:
DateTimePicker的值是Date对象。在将其发送到服务器之前,您可以将其格式化为您喜欢的任何形式。
当我初始化这个组件时,我这样做:
<el-date-picker
v-model="dateTimePicker"
format="yyyy-MM-dd HH:mm"
type="datetime"
size='small'
placeholder="Pick a date">
</el-date-picker>
dateTimePicker变量初始化如下:
dateTimePicker: moment.utc(this.initPublishedAtDate, 'YYYY-MM-DD HH:mm').local().format('YYYY-MM-DD HH:mm')
dateTimePicker从服务器获得分配日期,该日期从存储在服务器上的UTC时间转换为正确的本地时间。
现在一切都很好,用户在加载之前创建的内容时看到正确的时间,但现在如果用户试图保存他正在处理的任何内容,客户端将发送dateTimePicker中的任何内容,当前在新页面上dateTimePicker将在yyyy中 - MM-dd HH:mm格式
这当然是因为用户没有使用挑选任何新的时间,而且datepicker组件没有使用我服务器期望的新格式正确的值更新dateTimePicker变量。
现在服务器将收到错误的时间,即X小时偏移量,并为db保存不正确的时间。现在,如果用户刷新页面,时间将是错误的。每次用户在不触及datepicker组件的情况下保存到服务器时,每次都会有日期偏移,依此类推。
选项1: 如果用户没有使用datepicker组件并且datepicker没有正确格式化时间,我该如何向服务器发送正确的时间?
选项2: 我是否可以使用以下格式初始化datepicker组件:2017-08-11T16:11:00.000Z以便即使用户不对其执行任何操作并在保存时将数据发送到服务器,服务器也会收到正确的时间。
如果我想用第二个选项来做,当我用服务器的日期初始化dateTimePicker变量时,如何生成该格式。
感谢您的建议。
答案 0 :(得分:1)
基本上您要做的是允许用户以熟悉的格式输入和查看日期,但以ISO 8601格式将日期存储在数据库中。
您可以通过以下几种方式实现这一目标:
前端
在将日期传递给日期时间选择器之前格式化日期,然后再将其格式化,然后再将其发送回服务器。
Moment会自动识别ISO格式,因此要将其转换为更人性化的版本,请使用:
moment(date).format('YYYY-MM-DD HH:mm');
修改:日期时间选择器会自动将moment
实例强制转换为Date
实例,因此您可以避开format
步骤,只需执行以下操作:
moment(date);
要将其转换回ISO,您需要指定当前格式:
moment(date, 'YYYY-MM-DD HH:mm').toISOString();
示例实施:JSFiddle
后端
根据您使用的服务器技术,您将有许多不同的选项,但最常见的选项是:
<强>中间件强>
在发送回复之前和处理请求之前,请相应地格式化日期。
ORM mutators
从数据库中获取日期之后,在数据库中保存日期之前,使用访问器和更改器(分别是美化的getter和setter)对其进行格式化。像Laravel Eloquent和Ruby on Rails' ActiveRecord这样的热门ORM实施支持此功能。
答案 1 :(得分:0)
这有效:
dateTimePicker: moment.utc(this.initPublishedAtDate, 'YYYY-MM-DD HH:mm').format('YYYY-MM-DDTHH:mm:ssZ')