You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:33:16