【问题标题】:Is there a way to get the formatted date output with Angular Pipes有没有办法使用 Angular Pipes 获取格式化的日期输出
【发布时间】:2020-08-27 14:03:23
【问题描述】:

我有一个类似于'2020-01-15T10:45:20+02:30[US/Denver]' 的 ISO 区域日期时间字符串。我正在尝试使用有角的管道来使它看起来像'15 Jan 2020 ( US/Denver )'。最好的方法是什么。

目前我对此没有适当的管道实现,这就是我实现预期输出的方式

{{ dateInput | date:"dd-MMM-yyyy" }}{{ someFuntionThatReturnsTimeZoneWithStringManipulation() }}

提前致谢

【问题讨论】:

标签: javascript angular date-formatting


【解决方案1】:

您可以扩展默认日期管道、拆分字符串、转换日期并返回组合字符串。

这是一个快速实现

管道

import { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core';
import { DatePipe } from '@angular/common';

@Pipe({
  name: 'dateLocation',
  pure: true
})
export class DateLocationPipe extends DatePipe implements PipeTransform {
  constructor(@Inject(LOCALE_ID) locale: string) {
    super(locale);
  }

  transform(value: any, format?: string, timezone?: string, locale?: string): any {
    const date = value.split('[');
    return super.transform(date[0], format, timezone, locale) + ' (' + date[1].replace(/\]/g, ')');
  }
}

组件模板

{{ dateInput | dateLocation:"dd MMM yyyy" }}

工作示例:Stackblitz

更新:忽略 UTC 时间偏移

您可以在+ 符号上再执行一次split 并忽略时间戳的时间偏移。

管道

return super.transform(
    date[0].split('+')[0], 
    format, 
    timezone, 
    locale
  ) + 
  ' (' + 
  date[1].replace(/\]/g, ')');

工作示例:Stackblitz

【讨论】:

  • 很好的解决方案,但使用 dd MMM yyyy HH:mm 格式时似乎时间不正确。这会在其他时间打印。不是 ISO 区域日期时间字符串中提供的值。您能对此发表评论吗?
  • @Klaus:时间戳中有一个UTC time offset。所以时间是相应计算的。您预计会在什么时间出现?
  • 在输入字符串的同时。例如,如果输入字符串是 2020-01-15T10:45:20+02:30[US/Denver]。然后我的预期输出是 2020 年 1 月 1 日 10:45:20(美国/丹佛)。仅根据格式化程序输出输入值,无需任何日期/时间转换或操作
  • @Klaus:然后您可以在+ 符号上对时间戳再执行一次拆分并忽略偏移量。我已经更新了答案。
  • @Klaus:这不是问题。这就是 Javascript Date 对象的工作原理。你可以在这里找到更多信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多