转换为 ISO 字符串后返回日期/时间而不切片的另一种方法?

Posted

技术标签:

【中文标题】转换为 ISO 字符串后返回日期/时间而不切片的另一种方法?【英文标题】:Another way to return the date/time without slicing after converting to ISOString? 【发布时间】:2019-12-07 19:29:47 【问题描述】:

我有以下 JSON 字符串,我想从中提取日期和时间:

 "id": 1, "time":  "date": "2019-06-12 11:51:22.000000", "timezone_type": 3, "timezone": "UTC" , "productCategory": "some cat", "kitchen":  "house":  "id": 555, "name": "bigHouse" , "id": 55, "name": "smallKitchen", "country": "US"  

我目前是这样做的:


<tr v-for="(cabinet, i) in cabinets">
    <td> cabinet.kitchen.id </td>
    <td> cabinet.productCategory </td>
    <td> getDate(cabinet.time.date) </td>
    <td> getTime(cabinet.time.date) </td>
</tr>
<script>
const axios = require('axios');

export default 
    name: "Cabinets",
    data() 
      return 
          bedroom : this.$session.get('bedroom').id,
          cabinets: []
      
    ,
        mounted() 
        axios(
            method: 'GET',
            url: `/bedroom/$this.bedroom/cabinets`
        )
            .then(response => 
                this.cabinets = response.data
            )
        ,
    methods: 
        getDate(datetime) 
            return new Date(datetime).toISOString().slice(0,10);
        ,
        getTime(datetime) 
            return new Date(datetime).toISOString().slice(11,19);
        
    
    
</script>

日期可以正常工作,但时间不行。日期和时间分别返回如下:2019-06-1209:51:22。时间应该是11:51:22。这可能是因为我在尝试获取时间时使用了 Date() 方法,但是当我尝试使用 Time() 时出现错误:

[Vue 警告]:渲染错误:“ReferenceError:时间未定义”。

然而,即使我当时能找到一个非常简单的修复方法,我也真的不喜欢这种切片方式,并且正在寻找可以为我做到这一点的方法,因为如您所见,切片字符串已经出现故障。

【问题讨论】:

【参考方案1】:

您收到该错误的原因是 javascript 中没有 Time 对象。

更强大的方法是 Date 的toLocaleTimeString()。 您可以在 getTime() 方法中使用它:new Date(dateTime).toLocaleTimeString()

注意 toLocaleTimeString() 将显示用户机器文化指定的时间。

You can override this behavior, though.

【讨论】:

【参考方案2】:

简而言之,没有。约会是出了名的麻烦。我相信最受欢迎的包是Moment.js。确保将日期以标准 ISO 格式存储到数据库中,然后在从数据库中提取日期后在前端修改日期。

【讨论】:

【参考方案3】:

The "right" format for dates in JSON is ISO。我不认识你的时间对象。是标准格式吗?无论如何,因为它是 UTC,您可以轻松地使用字符串方法创建 ISO 日期,使用内置的 Date 对象对其进行解析,然后使用 toLocaleTimeString 对其进行格式化。要解析,请执行此操作...

new Date(time.date.replace(" ","T") + "Z").toLocaleString(,timeZone:"UTC")
                                          .toLocaleDateString()
                                          .toLocaleTimeString()

请注意,不要只获取您的日期字符串并将其提供给 Date 对象。未指定时区,因此解析器可能会或可能不会假设它是本地日期时间。 iso 字符串末尾的 Z 指示解析器它是 UTC,这就是它在您的 json 中所说的。

【讨论】:

以上是关于转换为 ISO 字符串后返回日期/时间而不切片的另一种方法?的主要内容,如果未能解决你的问题,请参考以下文章

将 ISO 8601 日期时间字符串转换为 **Date** 对象时,如何将日期时间重新定位到当前时区?

ISO日期格式从字符串到日期的转换会出错?

Python - 将日期的字符串表示形式转换为 ISO 8601

Oracle 将 ISO 日期转换为计算机区域设置日期/时间

T-SQL - 将日期时间转换为未分隔的 ISO 值

将iso日期格式的字符串转换为毫秒。 ISO日期格式包含(“ yyyy-MM-dd”),并且没有时区