【问题标题】:InvalidPipeArgument: '2017-12-05 05:30:00 for pipe 'DatePipe' - SafariInvalidPipeArgument: '2017-12-05 05:30:00 for pipe 'DatePipe' - Safari
【发布时间】:2018-06-02 03:27:48
【问题描述】:

例外

InvalidPipeArgument: '2017-12-05 05:30:00 for pipe 'DatePipe'

代码

以下代码在 mac 机器 chrome 浏览器上运行良好,但在 safari 中失败:

import { Pipe, PipeTransform } from '@angular/core';
import { DatePipe } from '@angular/common';
import * as moment from 'moment';

@Pipe({
    name: 'dateCulturePipe',
})
export class dateCulturePipe implements PipeTransform {
    transform(value: string) {
        if (value) {
            value = moment.utc(value).local().format('YYYY-MM-DD HH:mm:ss');
        }

        return value;
    }
}

使用

{{ (item.Date | dateCulturePipe) | date:'dd-MMM-yyyy HH:mm' }}

价值

Date

    2018-06-01 11:39:41.880
    2018-05-25 10:39:54.597
    NULL
    2018-05-23 09:33:00.000
    2018-05-22 13:04:20.190
    2018-05-22 11:20:14.530
    2018-05-19 11:55:53.750
    2018-05-19 11:55:04.117
    2018-05-18 11:34:06.190
    2018-05-10 11:57:18.507
    2018-05-10 11:44:25.893
    2018-05-10 11:42:47.467
    2018-05-10 11:42:21.197
    2018-05-10 11:41:46.363
    2018-05-10 11:40:42.483
    NULL
    NULL
    2018-05-04 11:04:00.000
    NULL
    2018-05-03 11:04:00.000
    NULL

已检查 - 不知道在哪里更改

https://github.com/angular/angular/issues/12334

【问题讨论】:

    标签: angular safari momentjs


    【解决方案1】:

    我也遇到了同样的问题,我已通过向 API 响应提供日期格式的 T 和 Z 进行了更正。 以前从后端,它来自 2017-07-28 12:02:14 现在从后端,我更改为 2017-07-28T12:02:14.000Z 格式,如果从后端你不能从前端更改使用替换方法,然后添加'Z'

    '2017-11-02 00:00:00.000'.replace(/\s/g, "T") + 'Z'
    

    最终结果将是:- 2017-11-02T00:00:00.000Z

    第二种方法:- 从空格中拆分字符串,然后添加“T”并连接另一部分,最后添加“Z”。

    let dateParts = '2017-11-02 00:00:00.000'.split(' ');
    console.log(dateParts[0]+'T'+dateParts[1]+'Z')
    

    现在在前端,显示你想要的任何格式,重要的是,如果你想显示 UTC 格式,那么角管道不会为你提供,你必须自己做。例如,如果它的“2017-11-02T12:00:00.000Z)

    {{mydate | date:'h:mm a'}} -> 5:30 PM -> according to local timezone
    

    如果要小写,则添加小写管道

    {{mydate | date:'h:mm a' | lowercase}}-> 5:30 pm -> according to local timezone
    

    如果您想按原样显示 UTC 日期而不更改为本地时间,那么

    HTML 文件

    {{showUTCDate(mydate) | date: 'h:mm a' | lowercase}} -> Output 12:00 pm
    

    TS 文件

      showUTCDate(utcdate){
        let date = new Date(utcdate);
        return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
      }
    

    您也可以使用管道更改此日期。

    【讨论】:

      【解决方案2】:

      你可以参考这个特定的问题

      Invalid argument for pipe 'DatePipe' - Safari cannot parse Date offsets

      要解决这个问题,请替换您的字符串

      '2017-11-02 00:00:00.000'.replace(/\s/g, "T")
      

      【讨论】:

      • 不走运,我得到了 "2018-06-02T04:38:44.507Z" ,应用 .replace(/\s/g, "T") 后它仍然与 "2018-06 -02T04:38:44.507Z"
      【解决方案3】:

      当日期格式为“2017-11-02 00:00:00.000”时,Safari 浏览器会引发错误。它需要 T 格式的日期,即“2017-11-02T00:00:00”,而不是日期和时间之间的空格。

      上述使用正则表达式匹配空格并将其替换为“T”的解决方案将起作用,该问题应在 Safari 上解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-21
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多