如何在

时间:2017-08-10 16:48:02

标签: javascript vue.js vuejs2 momentjs

我需要这样的输出:

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变量时,如何生成该格式。

感谢您的建议。

2 个答案:

答案 0 :(得分:1)

基本上您要做的是允许用户以熟悉的格式输入和查看日期,但以ISO 8601格式将日期存储在数据库中。

您可以通过以下几种方式实现这一目标:

  1. 前端

    在将日期传递给日期时间选择器之前格式化日期,然后再将其格式化,然后再将其发送回服务器。

    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

  2. 后端

    根据您使用的服务器技术,您将有许多不同的选项,但最常见的选项是:

    • <强>中间件

      在发送回复之前和处理请求之前,请相应地格式化日期。

    • ORM mutators

      从数据库中获取日期之后,在数据库中保存日期之前,使用访问器和更改器(分别是美化的getter和setter)对其进行格式化。像Laravel EloquentRuby on Rails' ActiveRecord这样的热门ORM实施支持此功能。

答案 1 :(得分:0)

这有效:

dateTimePicker: moment.utc(this.initPublishedAtDate, 'YYYY-MM-DD HH:mm').format('YYYY-MM-DDTHH:mm:ssZ')