Angular日期格式转换:如何将25-01-2024转为25 Jan 2024
解决Angular中日期输入框显示「DD MMM YYYY」格式的问题
你当前使用的<input type="date">是原生HTML控件,它的显示格式由浏览器和操作系统的区域设置决定,无法直接通过属性修改为「25 Jan 2024」这种自定义格式。要实现目标效果,需要通过隐藏原生日期控件+自定义显示区域+Angular DatePipe格式化的方式来处理。
1. 引入DatePipe依赖
在组件所属模块(如AppModule)中导入DatePipe并添加到providers数组:
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; import { DatePipe } from '@angular/common'; // 导入DatePipe import { AppComponent } from './app.component'; @NgModule({ declarations: [AppComponent], imports: [BrowserModule, FormsModule], providers: [DatePipe], // 注册DatePipe服务 bootstrap: [AppComponent] }) export class AppModule { }
2. 修改组件TS代码
调整数据模型初始值,注入DatePipe处理格式化,同时修正日期比较逻辑(原生控件绑定的是ISO字符串,需转成Date对象再比较):
import { Component } from '@angular/core'; import { DatePipe } from '@angular/common'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { modeldate = { fromdate: '', // 原生控件绑定ISO格式字符串,初始化为空 todate: '', Keywords: '', Name: '' }; constructor(private datePipe: DatePipe) {} // 将ISO日期字符串格式化为「DD MMM YYYY」 formatDate(dateStr: string): string { if (!dateStr) return ''; return this.datePipe.transform(dateStr, 'dd MMM yyyy') || ''; } get formattedFromDate() { return this.modeldate.fromdate; // [min]属性需要ISO格式字符串,直接返回原值 } updateEndDateValidation() { const fromDate = this.modeldate.fromdate ? new Date(this.modeldate.fromdate) : null; const toDate = this.modeldate.todate ? new Date(this.modeldate.todate) : null; if (fromDate && toDate && fromDate > toDate) { this.modeldate.todate = this.modeldate.fromdate; } } }
3. 修改HTML模板
隐藏原生日期控件,用可点击的容器模拟显示区域,点击时触发原生控件的选择弹窗,同时展示格式化后的日期:
<div class="row g-3 mb-3"> <div class="col-md-2" style="position: relative"> <label>From Date<span class="text-red" style="color: red;">*</span></label> <div class="input-box-container" id="fromdatediv"> <!-- 隐藏原生日期控件 --> <input required class="d-none" type="date" id="fromdate" [(ngModel)]="modeldate.fromdate" name="fromdate" (change)="updateEndDateValidation()" /> <!-- 自定义显示区域,点击触发原生控件选择日期 --> <div class="input-box form-control" style="cursor: pointer;" (click)="document.getElementById('fromdate')?.click()" > {{ modeldate.fromdate ? formatDate(modeldate.fromdate) : 'Select Date' }} </div> </div> </div> <div class="col-md-2" style="position: relative"> <label>To Date<span class="text-red" style="color: red;">*</span></label> <div class="input-box-container" id="todatediv"> <!-- 隐藏原生日期控件 --> <input required class="d-none" type="date" id="todate" [(ngModel)]="modeldate.todate" name="todate" (change)="updateEndDateValidation()" [min]="formattedFromDate" /> <!-- 自定义显示区域,点击触发原生控件选择日期 --> <div class="input-box form-control" style="cursor: pointer;" (click)="document.getElementById('todate')?.click()" > {{ modeldate.todate ? formatDate(modeldate.todate) : 'Select Date' }} </div> </div> </div> </div>
补充说明
- 原生
type="date"控件的ngModel绑定值始终是ISO 8601格式字符串(如2024-01-25),这也是[min]属性要求的格式,因此formattedFromDate直接返回原字符串即可。 - 若使用Angular 14+,也可直接在模板中使用
| date管道(无需在组件中注入DatePipe),示例:{{ modeldate.fromdate | date:'dd MMM yyyy' }},需确保模块已导入CommonModule。
内容的提问来源于stack exchange,提问作者Shivam Maurya
相关产品推荐
相关产品推荐

