news 2026/9/25 14:22:02

ng-zorro-antd DatePicker 完整指南:日期/范围选择器的 API、国际化配置与源码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ng-zorro-antd DatePicker 完整指南:日期/范围选择器的 API、国际化配置与源码实现
  • UI组件
  • 前端

【免费下载链接】ng-zorro-antd

Angular UI Component Library based on Ant Design

项目地址:https://gitcode.com/gh_mirrors/ng/ng-zorro-antd
点击查看免费下载

本篇指南围绕 ng-zorro-antd 官方日期选择框文档(components/date-picker/doc/index.zh-CN.md)展开,系统讲解nz-date-picker与nz-range-picker的完整 API、国际化与日期适配器配置、表单集成方式,并结合仓库源码(如 date-picker.component.ts)还原默认值、格式推导、弹层控制与全局配置等实现细节,帮助你在 Angular 项目中正确落地日期录入场景并理解其底层行为。

何时使用

官方文档给出的使用场景非常明确:当用户需要输入一个日期,可以点击标准输入框,弹出日期面板进行选择。日期选择框属于「数据录入」类组件,适合表单中的日期字段、预约/排期、报表时间范围筛选等场景。

仓库内的示例组件展示了它的两种基本形态(demo/basic.ts、demo/range-picker.ts):

  • nz-date-picker:单值选择,通过nzMode切换date/week/month/quarter/year五种粒度;
  • nz-range-picker:范围选择,值为[开始, 结束]的日期数组,同样支持上述模式。

前置配置:国际化与日期适配器

官方文档在 API 章节开头给出两条关键注意事项,二者共同构成了使用 DatePicker 的前置条件。

1. Angular 自身的语言包

nz-date-picker的部分 locale 来自于 Angular 自身的国际化支持,需要在app.config.ts文件中引入相应的 Angular 语言包。

import { registerLocaleData } from '@angular/common'; import zh from '@angular/common/locales/zh'; registerLocaleData(zh);

这一步决定 Angular 框架层(如内置管线的日期格式)使用的语言规则,与 NG-ZORRO 组件自身通过NzI18nService加载的 locale 是两套配置,缺一不可。

2. 日期适配器(v22 起必须显式提供)

结合仓库内 日期适配器文档 可以确认:从 v22 开始,NG-ZORRO 不再默认提供日期引擎适配器,应用需要在根配置中显式提供 adapter,否则 DatePicker、Calendar、TimePicker 会因缺少NzDateAdapterprovider 而无法工作。若希望与之前版本保持一致,可使用内置的date-fns适配器:

import { ApplicationConfig } from '@angular/core'; import { zhCN } from 'date-fns/locale'; import { provideNzDateFnsAdapter } from 'ng-zorro-antd/core/time'; export const appConfig: ApplicationConfig = { providers: [provideNzDateFnsAdapter({ locale: zhCN, firstDayOfWeek: 1 })] };

也可以使用provideNzNativeDateAdapter({ locale: 'zh-CN', firstDayOfWeek: 1 })让日期能力走原生Date与Intl.DateTimeFormat语义。需要注意:NZ_I18N控制 NG-ZORRO 组件文案,adapter 的locale控制日期库的格式化与周规则(月份名、星期名、周起始日);nzFormat及默认格式字符串都由当前 adapter 解释,切换日期库时要确认 token 语法一致。

3. 输入输出均为Date

文档明确:所有输入输出日期对象均为原生Date,你可以通过 date-fns 等工具库获得你需要的数据。这一条在源码中得到印证:date-picker.component.ts 中,组件在通过表单控制回调onChangeFn上报值时,统一取内部CandyDate的nativeDate(即原生Date);范围选择器则上报[start, end]两个Date。因此在业务层拿到的值始终是Date或Date[],组件内部只是用CandyDate做了封装。

快速上手

以下示例摘自 demo/basic.ts 与 demo/range-picker.ts:

import { Component, signal } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { NzDatePickerModule } from 'ng-zorro-antd/date-picker'; @Component({ selector: 'nz-demo-date-picker-basic', imports: [FormsModule, NzDatePickerModule], template: ` <nz-date-picker [(ngModel)]="date" (ngModelChange)="onChange($event)" /> <br /> <nz-date-picker nzMode="week" [(ngModel)]="date" /> <br /> <nz-date-picker nzMode="month" [(ngModel)]="date" /> <br /> <nz-date-picker nzMode="quarter" [(ngModel)]="date" /> <br /> <nz-date-picker nzMode="year" [(ngModel)]="date" /> ` }) export class NzDemoDatePickerBasicComponent { readonly date = signal<Date | null>(null); onChange(result: Date): void { console.log('onChange: ', result); } }
@Component({ selector: 'nz-demo-date-picker-range-picker', imports: [FormsModule, NzDatePickerModule], template: ` <nz-range-picker [(ngModel)]="date" (ngModelChange)="onChange($event)" /> <br /> <nz-range-picker [nzShowTime]="true" [(ngModel)]="date" /> <br /> <nz-range-picker nzMode="month" [(ngModel)]="date" /> ` }) export class NzDemoDatePickerRangePickerComponent { readonly date = signal<Date[] | null>(null); onChange(result: Date[]): void { console.log('onChange: ', result); } }

组件通过NzDatePickerModule引入(模块导出见 public-api.ts)。启用时间选择时,nzShowTime既可以传true,也可以传一个对象用于自定义时间面板(见 demo/time.ts):

<nz-date-picker nzShowTime nzFormat="yyyy-MM-dd HH:mm:ss" ngModel (nzOnOk)="onOk($event)" /> <nz-range-picker [nzShowTime]="{ nzFormat: 'HH:mm' }" nzFormat="yyyy-MM-dd HH:mm" ngModel />

共同的 API

以下 API 为nz-date-picker、nz-range-picker共享,完整继承自官方文档的 API 表:

参数说明类型默认值全局配置版本
[nzId]组件内部 input 的 id 值string---
[nzAllowClear]是否显示清除按钮booleantrue--
[nzAutoFocus]自动获取焦点booleanfalse--
[nzBackdrop]浮层是否应带有背景板booleanfalse--
[nzDefaultPickerValue]默认面板日期Date \| Date[]---
[nzDisabled]禁用booleanfalse--
[nzDisabledDate]不可选择的日期(current: Date) => boolean---
[nzDropdownClassName]额外的弹出日历 classNamestring---
[nzFormat]展示的日期格式,见「nzFormat 特别说明」string---
[nzInputReadOnly]为 input 标签设置只读属性(避免在移动设备上触发小键盘)booleanfalse--
[nzLocale]国际化配置object默认配置(Ant Design locale 示例结构)--
[nzMode]选择模式'date' \| 'week' \| 'month' \| 'quarter' \| 'year''date'--
[nzPlaceHolder]输入框提示文字string \| string[]---
[nzPopupStyle]额外的弹出日历样式object{}--
[nzRenderExtraFooter]在面板中添加额外的页脚TemplateRef \| string \| (() => TemplateRef \| string)---
[nzSize]输入框大小,large高度为 40px,small为 24px,默认是 32px'large' \| 'small'---
[nzStatus]设置校验状态'error' \| 'warning'---
[nzPlacement]选择框弹出的位置'bottomLeft' \| 'bottomRight' \| 'topLeft' \| 'topRight''bottomLeft'--
[nzSuffixIcon]自定义的后缀图标string \| TemplateRef-✅-
[nzVariant]形态变体'outlined' \| 'borderless' \| 'filled' \| 'underlined''outlined'✅20.0.0
[nzInline]内联模式booleanfalse--
(nzOnOpenChange)弹出日历和关闭日历的回调EventEmitter<boolean>---
(nzOnPanelChange)改变模式或日期的回调EventEmitter<NzPanelChangeType>---

nzFormat 特别说明:官方文档将该参数与 TimePicker 的 API 关联,即nzFormat的 token 语法由当前日期适配器解释,时间格式(HH:mm:ss)等写法与 time-picker 共享同一套格式约定。

共同的方法

组件以exportAs: 'nzDatePicker'导出,可通过模板引用调用以下方法:

名称描述
open()打开日历弹层
close()关闭日历弹层

源码级解读:选择器、默认值与全局配置

结合 date-picker.component.ts 可以进一步理解上表的实现:

  1. 五种粒度 + 范围选择器共用一个基座。组件的selector为'nz-date-picker,nz-week-picker,nz-month-picker,nz-quarter-picker,nz-year-picker,nz-range-picker'(第 105 行),所有选择器都由NzDatePickerComponent承载。而 range-picker.component.ts 中的NzRangePickerComponent实际上是一个空指令,仅用于依赖注入探测:基类通过isRange = !!inject(NzRangePickerComponent, { self: true, optional: true })判断当前是否为范围选择器,进而渲染左右两个输入框、分隔符与激活指示条。
  2. 默认值与文档一致。源码中nzAllowClear = true、nzShowToday = true、nzShowNow = true、nzMode = 'date'、nzPlacement = 'bottomLeft'、nzShowWeekNumber = false、nzInline = false,与文档表格完全对应;nzPopupStyle的初始值为POPUP_STYLE_PATCH = { position: 'relative' }(第 96 行),目的是覆盖 antd 样式以保证浮层定位策略生效,因此实际传入的nzPopupStyle会被自动合入该补丁(见ngOnChanges)。
  3. 「全局配置」列对应@WithConfig()装饰器。带 ✅ 的nzSuffixIcon、nzVariant(以及范围选择器的nzSeparator、nzBackdrop)都标注了@WithConfig(),组件通过readonly _nzModuleName: NzConfigKey = 'datePicker'声明模块名,意味着这些输入可以在应用级通过NzConfigService对datePicker做全局默认值配置。
  4. 默认格式按模式自动推导。setModeAndFormat()(第 799-821 行)在未显式设置nzFormat时按模式给出默认格式:year → 'yyyy'、quarter → 'yyyy-[Q]Q'、month → 'yyyy-MM'、week → 'YYYY-ww'、date → 'yyyy-MM-dd'(启用nzShowTime时为'yyyy-MM-dd HH:mm:ss');同时输入框宽度按Math.max(10, nzFormat.length) + 2计算。
  5. 弹出位置映射。nzPlacement经setPlacement()通过DATE_PICKER_POSITION_MAP映射为 CDK Overlay 的ConnectionPositionPair,并将其置于候选位置列表首位(默认候选为DEFAULT_DATE_PICKER_POSITIONS),从而实现四角弹出与自动翻转。

nz-date-picker 专属 API

值绑定

参数说明类型默认值
[(ngModel)]日期Date-

组件实现了ControlValueAccessor(第 275 行),因此除ngModel外同样支持formControl等模板/响应式表单绑定,writeValue、setDisabledState等回调均已实现;表单校验状态(nzStatus)会联动NzFormStatusService渲染反馈图标。

nz-date-picker[nzMode="date"]

参数说明类型默认值
[nzDateRender]自定义日期单元格的内容(month-picker/year-picker 不支持)TemplateRef<Date> \| string \| ((d: Date) => TemplateRef<Date> \| string)-
[nzDisabledTime]不可选择的时间(current: Date) => { nzDisabledHours, nzDisabledMinutes, nzDisabledSeconds }-
[nzShowTime]增加时间选择功能object \| booleanTimePicker Options
[nzShowToday]是否展示“今天”按钮booleantrue
[nzShowNow]当设定了nzShowTime的时候,面板是否显示“此刻”按钮booleantrue
[nzShowWeekNumber]是否在每一行显示周数(仅日期选择器支持。周选择器始终显示周数)booleanfalse
(nzOnOk)点击确定按钮的回调EventEmitter<Date>-

关于(nzOnOk),源码中的onResultOk()(第 929-944 行)区分了两种情况:单日期选择器上报单个Date或null;范围选择器上报[start, end]数组——与上表及下文 range-picker 的EventEmitter<Date[]>声明一致。

nz-range-picker 专属 API

值绑定与范围参数

参数说明类型默认值
[(ngModel)]日期Date[]-
[nzRanges]预设时间范围快捷选择{ [ key: string ]: Date[] } \| { [ key: string ]: () => Date[] }-
[nzSeparator]分隔符string \| TemplateRef'~'
(nzOnCalendarChange)待选日期发生变化的回调EventEmitter<Date[]>-

其中nzRanges支持静态数组或函数两种形式(类型定义PresetRanges见 standard-types.ts),函数形式适合「最近 7 天」「本月」这类相对时间范围。分隔符的渲染逻辑在基类模板中:当nzSeparator有值时按字符串或TemplateRef输出,否则回退为内置的swap-right图标(模板第 133-143 行)。

nz-range-picker[nzMode="date"]

参数说明类型默认值
[nzShowTime]增加时间选择功能object \| booleanTimePicker Options
[nzDisabledTime]不可选择的时间(current: Date, partial: 'start' \| 'end') => { nzDisabledHours, nzDisabledMinutes, nzDisabledSeconds }-
[nzShowWeekNumber]是否在每一行显示周数(仅日期选择器支持。周选择器始终显示周数)booleanfalse
(nzOnOk)点击确定按钮的回调EventEmitter<Date[]>-

注意范围选择器的nzDisabledTime比单日期多一个partial: 'start' | 'end'参数,用于分别限制起止两个端点可选的小时/分钟/秒。

nzShowTime中当前支持的nz-time-picker参数有:nzFormat、nzHourStep、nzMinuteStep、nzSecondStep、nzDisabledHours、nzDisabledMinutes、nzDisabledSeconds、nzHideDisabledOptions、nzDefaultOpenValue、nzAddOn。

从源码看,nzShowTime的完整对象类型是SupportTimeOptions(standard-types.ts),组件的 setter 会将布尔值转成boolean、对象原样保留;该接口中额外还定义了nzUse12Hours,可作为 12 小时制的扩展能力参考。

FAQ

如何在 Date-Picker 中使用自定义日期库

参考 日期适配器文档。其核心做法是:自定义 adapter 继承NzDateAdapter<TDate, TLocale>,推荐TDate继续使用Date以保持组件 API 与表单值兼容,只把格式化、解析和日期计算委托给第三方日期库(文档给出了完整的 Day.js 实现示例),然后在应用根配置中通过provideNzDateAdapter(MyAdapter, { locale: 'zh-cn', firstDayOfWeek: 1 })注册。启用时间选择能力时还需实现setTime、getHours、getMinutes、getSeconds、parseTime、addSeconds等时间相关方法。

滚动时浮层元素没有跟随滚动位置

默认情况下,浮层元素使用body作为滚动容器。如果使用了其他滚动容器,在自定义滚动容器元素上添加CdkScrollable指令即可让 CDK Overlay 感知正确的滚动父级,浮层会随之跟随滚动位置更新。注意:需要从@angular/cdk/scrolling导入CdkScrollable指令或ScrollingModule模块。

小结与延伸阅读

  • 官方 API 文档:doc/index.zh-CN.md;
  • 基座组件实现:date-picker.component.ts,涵盖打开/关闭弹层、输入校验(checkValidDate会同时用parse与format往返验证输入合法性)、失焦回滚(checkAndClose在值不合法时恢复initialValue)、以及 ESC 键重置等交互细节;
  • 时间相关工具与类型:util.ts、standard-types.ts(NzPanelChangeType、DisabledTimeFn等类型定义,可对照(nzOnPanelChange)的联合类型结构);
  • 日期适配器配置:docs/date-adapter.zh-CN.md,v22 起使用 DatePicker 前必须完成 adapter 注册。
  • UI组件
  • 前端

【免费下载链接】ng-zorro-antd

Angular UI Component Library based on Ant Design

项目地址:https://gitcode.com/gh_mirrors/ng/ng-zorro-antd
点击查看免费下载
上一篇:3步精通鸣潮智能助手:零门槛自动化游戏全攻略
下一篇:抖音下载神器:5分钟掌握无水印批量下载完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 14:20:28

15KW永磁同步电机双闭环PI控制Simulink仿真实践

接到一台15KW永磁同步电机的控制系统设计任务时&#xff0c;我身边不少同事的第一反应是直接打开Simulink拖模型——这其实是最容易翻车的开法。双闭环PI控制本身不复杂&#xff0c;但真正决定项目成败的&#xff0c;往往是建模前的参数核算、PI整定里的工程约束&#xff0c;以…

作者头像 李华
网站建设 2026/9/25 14:18:59

Win10共享文件夹提示网络凭证?看这篇排查与解决指南

很多人在Windows 10里设置共享文件夹时&#xff0c;都会在客户端那一端碰到一个很典型的弹窗&#xff1a;“请输入网络凭证”。更让人迷惑的是&#xff0c;自己明明已经把everyone加进了共享权限&#xff0c;密码保护共享也关掉了&#xff0c;结果对方电脑访问时还是跳出这个框…

作者头像 李华
网站建设 2026/9/25 14:18:54

双屏显示下PPT不在主屏?从系统设置到放映配置全攻略

1. 先搞清楚&#xff1a;PPT 为什么总爱“赖”在主屏幕上遇到双屏幕下 PPT 显示位置不对的问题&#xff0c;绝大多数人第一反应是去 PPT 设置里翻&#xff0c;结果翻来翻去也就一个“显示于”下拉框&#xff0c;选了也没啥用。我先说句实话&#xff1a;这个问题一半是 PPT 的设…

作者头像 李华
网站建设 2026/9/25 14:18:03

Everything搜不到移动硬盘?三步排查彻底解决

1. 先搞清楚Everything搜文件的逻辑&#xff0c;才知道它为什么会"装瞎"移动硬盘插在电脑上&#xff0c;Everything就是搜不到里面的文件&#xff0c;很多人第一反应是怀疑软件坏了&#xff0c;或者干脆重装一遍。但实测下来&#xff0c;问题几乎都出在同一个地方&am…

作者头像 李华
网站建设 2026/9/25 14:09:41

Win10下安装MSDE 2000数据库引擎完整指南与排错手册

简介&#xff1a;面向在Windows 10 64位环境下安装MSDE2000数据库受阻的用户&#xff0c;包内整合了可用的安装程序与配套教程。针对网上教程普遍绕不开的SysWOW64文件夹修改权限难题&#xff0c;作者找到一键解决方式并实测成功&#xff0c;省去繁琐手工授权步骤。压缩包共50个…

作者头像 李华