Angular 4中的日期管道自定义格式和时区(short)

3
我需要打印带有时区的自定义格式时间戳(简短格式):
{{ '2017-06-29 09:55:01.956-0400' | date:'MMM dd, y hh:mm a' }}

输出:

2017年6月29日 下午7:25

但我需要附上时区,例如:

2017年6月29日 下午7:25 IST

Angular提供了带有'z''Z'选项的时区,但没有一个给出预期的结果:

'MMM dd, y hh:mm a  z' ==> Jun 29, 2017 07:25 PM India Standard Time
'MMM dd, y hh:mm a  Z' ==> Jun 29, 2017 07:25 PM GMT+5:30

我想要的是2017年7月7日,印度标准时间上午12:27:01


你能详细说明一下“没有给出预期结果”的意思吗?是显示了错误的时区还是根本没有显示?添加 Z 似乎提供了正确的时区,这在这个 plunkr 中得到了证明。它以三个字符的格式完全匹配了我的时区。 - Alexander Staroselsky
问题已编辑,请检查,谢谢。 - mperle
我认为您需要编写自己的日期格式化管道来处理这个问题。它可以使用现有的日期/时间格式管道返回一个值,然后操作时区以返回三位数字版本而不是完整文本。 - Stephen R. Smith
1个回答

5

DatePipe使用Intl来格式化日期。因此,取决于您的网站所在的系统,决定以何种格式返回当前时区。为了实现所需的行为,建议您创建一个自定义的DatePipe,该管道将返回所需的时区缩写。例如:

import { Pipe } from "@angular/core";
import { DatePipe } from "@angular/common";

@Pipe({
    name: "myDate",
    pure: true
})
export class MyDatePipe extends DatePipe {
    transform(value: any, pattern: string = "mediumDate"): string|null {
        let result = super.transform(value, pattern);
        result += " " + this.map[Intl.DateTimeFormat().resolvedOptions().timeZone];
        return result;
    }
    map = {
        "Asia/Calcutta": "IST"
    };
}

但是,您需要将每个可能的时区添加到map对象中。请参阅展示了这种方法的Plunker示例


是的,这很有帮助。谢谢。让我们看看 Angular 团队是否会在即将发布的版本中更新更短的时区格式..!! - mperle
我认为这甚至不会被实现,因为这不取决于Angular,而是取决于系统设置。它们可能基于您的浏览器和操作系统而有所不同。因此,您可能会得到不同的结果。 - Gosha_Fighten
有没有办法使用夏令时? - dileep balineni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接