InvalidPipeArgument:'2017-12-05 05:30:00管道'DatePipe' - Safari

时间:2018-06-02 03:27:49

标签: angular safari momentjs

异常

  

InvalidPipeArgument:'2017-12-05 05:30:00管道'DatePipe'

代码

  

以下代码在mac machine 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

3 个答案:

答案 0 :(得分:1)

您可以参考此特定问题

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

要解决此问题,请更换字符串

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

答案 1 :(得分:0)

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

上述带有正则表达式以匹配空间并用“ T”代替的解决方案将起作用,并且该问题应在Safari上解决。

答案 2 :(得分:0)

我也遇到了同样的问题,我已通过在API响应的日期格式中提供T和Z来更正。 以前是从后端来的,就像是2017-07-28 12:02:14,现在是从后端来的,我改成了2017-07-28T12:02:14.000Z格式,如果从后端不能更改,那么从前端使用replace方法,然后添加'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());
  }

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