Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用moment制作此特定格式_Javascript_Vue.js_Vuejs2_Momentjs - Fatal编程技术网

Javascript 如何使用moment制作此特定格式

Javascript 如何使用moment制作此特定格式,javascript,vue.js,vuejs2,momentjs,Javascript,Vue.js,Vuejs2,Momentjs,我需要这样的输出: <el-date-picker v-model="dateTimePicker" format="yyyy-MM-dd HH:mm" type="datetime" size='small' placeholder="Pick a date"> </el-date-picker> 2017-08-11T16:11:00.000Z 我不知道这种格式叫什么。这种格式似乎至少有两种变体,上面的一种和下面的一种: 20

我需要这样的输出:

<el-date-picker
    v-model="dateTimePicker"
    format="yyyy-MM-dd HH:mm"
    type="datetime"
    size='small'
    placeholder="Pick a date">
</el-date-picker>
2017-08-11T16:11:00.000Z

我不知道这种格式叫什么。这种格式似乎至少有两种变体,上面的一种和下面的一种:

2017-08-11 16:11:00+00:00

是同一件事吗?为什么有两种变体

现在我的问题是,我正在使用Vue2,具体来说,我正在使用以下组件:

将日期呈现给用户时,此组件将以以下格式显示: 2017-08-11 18:11:00

幕后如果我使用Vue调试器检查组件值,它会像2017-08-11T16:11:00.000Z一样存储

如果您注意到该值实际上是2小时偏移量,我猜这个vue组件会根据用户选择的时间和用户时区在内部存储UTC时间的值

当我问这个组件的创建者组件中存储了什么格式值时,我得到了他的回答:

DateTimePicker的值是一个日期对象。在将其发送到服务器之前,您可以将其格式化为您喜欢的任何形式

当我初始化这个组件时,我是这样做的:

<el-date-picker
    v-model="dateTimePicker"
    format="yyyy-MM-dd HH:mm"
    type="datetime"
    size='small'
    placeholder="Pick a date">
</el-date-picker>
dateTimePicker从服务器获取分配的日期,该日期从服务器上存储的UTC时间转换为正确的本地时间

现在一切都好了,用户在加载之前创建的东西时看到了正确的时间,但现在如果用户尝试保存他正在处理的东西,客户端将发送dateTimePicker中的任何东西,当前在新页面上的dateTimePicker将采用yyyy MM dd HH:MM格式

这当然是因为用户并没有使用拾取的任何新时间,并且datepicker组件并没有使用我的服务器所期望的新的格式正确的值更新dateTimePicker变量

现在服务器将收到错误的时间,即X小时偏移量,并将错误的时间保存到数据库。现在,如果用户刷新页面,时间将是错误的。每次用户保存到服务器而不接触datepicker组件时,日期每次都会得到偏移量,以此类推

备选案文1: 若用户并没有弄乱datepicker组件,并且datepicker并没有插入正确格式化的时间,那个么如何向服务器发送正确的时间

备选案文2: 我是否可以用以下格式初始化datepicker组件:2017-08-11T16:11:00.000Z,这样即使用户对其不做任何操作,并且数据在保存时发送到服务器,服务器也会收到正确的时间

若我想使用第二个选项,那个么当我使用来自服务器的日期初始化dateTimePicker变量时,如何生成该格式

感谢您的建议。

此功能:

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

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

您可以通过以下两种方式实现这一点:

  • 前端

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

    Moment将自动识别ISO格式,因此要将其转换为更人性化的版本,请使用:

    moment(date).format('YYYY-MM-DD HH:mm');
    
    编辑:日期时间选择器将自动将
    时刻
    实例转换为
    日期
    实例,因此您可以避免
    格式
    步骤,只需执行以下操作:

    moment(date);
    
    要将其转换回ISO,需要指定当前格式:

    moment(date, 'YYYY-MM-DD HH:mm').toISOString();
    
    一个示例实现:

  • 后端

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

    • 中间件

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

    • ORM突变子

      从数据库中获取日期后,在将其持久化到数据库中之前,使用访问器和变异器(本质上分别是美化的getter和setter)对其进行格式化。流行的ORM实现喜欢并支持这一点


  • this.initPublishDatDate是什么类型的对象?字符串?关于Z格式,它是ISO格式:
    2017-08-11T16:11:00.000Z
    is。第二种格式(没有
    T
    )不符合ISO标准。但是
    +00:00
    Z
    的意思是相同的(“零偏移量”)RoyJ,它是一个格式为yyyy-mm-dd HH:mm:ss的字符串。雨果感谢你的澄清。我如何从yyyy-mm-dd HH:mm:sswith-矩js生成此ISO 8601格式,可能吗?我注意到您的小提琴最初使用字符串填充
    date
    ,但datepicker将其更改为日期对象。如果将其保留为日期,则会简化一些事情(通过时间的次数更少):