如何在Angular 5中将Contentful返回的日期格式化为指定字符串
在Angular 5中格式化Contentful日期为"17th May 2018"格式
没问题!在Angular 5里完全可以实现这个日期格式转换——既然Contentful没提供字符串格式化选项,我们就用Angular自带的工具加上一点自定义逻辑来搞定。下面给你两种实用的实现方式:
方法一:组件内直接处理(适合单个组件使用)
Angular 5内置的DatePipe能处理大部分日期格式,但默认不支持序数词后缀(比如17th里的th),所以我们可以结合DatePipe和自定义函数来实现:
1. 先在模块中注册DatePipe
Angular 5需要手动把DatePipe加入模块的providers数组:
import { DatePipe } from '@angular/common'; @NgModule({ // 其他模块配置(如declarations、imports等) providers: [DatePipe] }) export class YourBlogModule { }
2. 在组件中注入并编写格式化逻辑
在你的博客组件里注入DatePipe,然后写一个处理日期的方法:
import { Component } from '@angular/core'; import { DatePipe } from '@angular/common'; @Component({ selector: 'app-blog-post', templateUrl: './blog-post.component.html' }) export class BlogPostComponent { blog: any; // 从Contentful获取的博客数据 constructor(private datePipe: DatePipe) { } // 生成带序数词的格式化日期 getFormattedPublishDate(dateStr: string): string { const publishDate = new Date(dateStr); // 提取日、月份和年份 const day = this.datePipe.transform(publishDate, 'd'); const monthYear = this.datePipe.transform(publishDate, 'MMMM y'); // 添加序数词后缀 const ordinalSuffix = this.getOrdinalSuffix(parseInt(day, 10)); return `${day}${ordinalSuffix} ${monthYear}`; } // 计算日期的序数词后缀 private getOrdinalSuffix(day: number): string { // 11-19都是th if (day > 3 && day < 21) return 'th'; // 其他情况根据最后一位判断 switch (day % 10) { case 1: return 'st'; case 2: return 'nd'; case 3: return 'rd'; default: return 'th'; } } }
3. 在模板中调用方法
直接在HTML里调用这个格式化方法:
<p>Published: {{ getFormattedPublishDate(blog.fields.createdAt) }}</p>
方法二:自定义管道(适合多个组件复用)
如果你的多个页面都需要这种日期格式,自定义一个Angular管道会更优雅,方便全局复用:
1. 创建自定义管道
用Angular CLI快速生成一个管道(也可以手动创建):
ng generate pipe ordinal-date
然后修改管道代码,整合DatePipe和序数词逻辑:
import { Pipe, PipeTransform } from '@angular/core'; import { DatePipe } from '@angular/common'; @Pipe({ name: 'ordinalDate' }) export class OrdinalDatePipe implements PipeTransform { constructor(private datePipe: DatePipe) { } transform(dateValue: string | Date): string { // 处理无效日期的情况 const publishDate = typeof dateValue === 'string' ? new Date(dateValue) : dateValue; if (!(publishDate instanceof Date) || isNaN(publishDate.getTime())) { return ''; } const day = this.datePipe.transform(publishDate, 'd'); const monthYear = this.datePipe.transform(publishDate, 'MMMM y'); const ordinalSuffix = this.getOrdinalSuffix(parseInt(day, 10)); return `${day}${ordinalSuffix} ${monthYear}`; } private getOrdinalSuffix(day: number): string { if (day > 3 && day < 21) return 'th'; switch (day % 10) { case 1: return 'st'; case 2: return 'nd'; case 3: return 'rd'; default: return 'th'; } } }
2. 在模块中注册管道
把自定义管道加入模块的declarations数组,同时别忘了注册DatePipe:
import { OrdinalDatePipe } from './ordinal-date.pipe'; import { DatePipe } from '@angular/common'; @NgModule({ declarations: [ // 其他组件、指令 OrdinalDatePipe ], providers: [DatePipe] }) export class YourBlogModule { }
3. 在模板中使用管道
现在可以像用内置管道一样直接在HTML里使用:
<p>Published: {{ blog.fields.createdAt | ordinalDate }}</p>
小提示
- 确保Contentful返回的
createdAt是有效的日期字符串(比如2018-05-17),Angular能正常解析这种格式。 - 如果你的项目有严格类型检查,记得处理
blog或createdAt可能为null/undefined的情况,避免报错。
内容的提问来源于stack exchange,提问作者Jm3s
相关产品推荐
相关产品推荐

