syncfusion-angular-daterangepicker

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Implementing Syncfusion Angular DateRangePicker

实现 Syncfusion Angular DateRangePicker

A comprehensive guide for implementing the Syncfusion Essential JS 2 DateRangePicker component in Angular applications. Learn to create date range pickers, handle range selection, manage events, and customize styling.
这是一份在Angular应用中实现Syncfusion Essential JS 2 DateRangePicker组件的综合指南,你可以学习如何创建日期范围选择器、处理范围选择、管理事件以及自定义样式。

DateRangePicker Overview

DateRangePicker 概述

The Syncfusion Angular DateRangePicker component is a specialized date selection widget that provides:
  • Dual calendar display: Start and end date selection with synchronized calendars
  • Preset ranges: Predefined options like "Last 7 Days", "This Month", "Last Month", "Custom"
  • Range validation: Min/max dates, disabled ranges, required range length
  • Date formatting: Customizable date format with separators and pattern support
  • Event system: Created, destroyed, change, select, rangeSelected, open, close, renderDayCell events
  • Keyboard shortcuts: Tab, arrow keys, enter, escape for full keyboard accessibility
  • Localization support: Locale-specific formatting, day headers, month names
  • Accessibility: Full WCAG 2.2 compliance, ARIA attributes, screen reader support
  • Rich customization: CSS classes, custom templates, day cell rendering
  • Mobile optimization: Touch-friendly interface, responsive design, full-screen mode
Package:
@syncfusion/ej2-angular-calendars
Syncfusion Angular DateRangePicker是一款专业的日期选择组件,提供以下能力:
  • 双日历展示: 同步日历支持选择开始和结束日期
  • 预设范围: 预定义选项如「过去7天」、「本月」、「上月」、「自定义」
  • 范围验证: 最小/最大日期、禁用范围、必填范围长度
  • 日期格式化: 可自定义日期格式,支持分隔符和模式配置
  • 事件系统: created、destroyed、change、select、rangeSelected、open、close、renderDayCell事件
  • 键盘快捷键: Tab、方向键、回车、Escape实现全键盘操作无障碍
  • 本地化支持: 适配区域的格式、星期表头、月份名称
  • 无障碍支持: 完全符合WCAG 2.2标准,支持ARIA属性、屏幕阅读器
  • 丰富的自定义能力: CSS类、自定义模板、日期单元格渲染
  • 移动端优化: 触控友好界面、响应式设计、全屏模式
包:
@syncfusion/ej2-angular-calendars

Documentation Navigation

文档导航

Read the following references based on your specific needs:
你可以根据自身需求阅读以下参考文档:

Getting Started

入门指南

📄 Read: references/getting-started.md
  • Package installation and module setup
  • CSS theme imports and dependencies
  • Basic DateRangePicker implementation
  • Component initialization in Angular
  • Start and end date configuration
  • Running and testing setup
📄 阅读: references/getting-started.md
  • 包安装与模块配置
  • CSS主题导入与依赖
  • 基础DateRangePicker实现
  • Angular中的组件初始化
  • 开始与结束日期配置
  • 运行与测试设置

Date Range Selection

日期范围选择

📄 Read: references/date-range-selection.md
  • Single click range selection
  • Sequential date selection (click start, then end)
  • Date range value binding (
    startDate
    ,
    endDate
    properties)
  • Min/max date constraints
  • Range validation and error handling
  • Disabled date ranges
  • Clearing selections
📄 阅读: references/date-range-selection.md
  • 单击范围选择
  • 顺序日期选择(点击开始日期,再点击结束日期)
  • 日期范围值绑定(
    startDate
    endDate
    属性)
  • 最小/最大日期约束
  • 范围验证与错误处理
  • 禁用日期范围
  • 清空选择

Preset Ranges

预设范围

📄 Read: references/preset-ranges.md
  • Predefined range options (Last 7 Days, Last Month, etc.)
  • Custom preset configuration
  • Programmatic preset application
  • Dynamic preset generation
  • Preset change events
  • Combining presets with constraints
📄 阅读: references/preset-ranges.md
  • 预定义范围选项(过去7天、上月等)
  • 自定义预设配置
  • 程序化应用预设
  • 动态预设生成
  • 预设变更事件
  • 预设与约束结合使用

Events & Methods

事件与方法

📄 Read: references/events-and-methods.md
  • Event handlers (change, select, rangeSelected, open, close)
  • Range selection event details (startDate, endDate, daySpan)
  • Programmatic methods (show(), hide(), getSelectedRange())
  • Created and destroyed lifecycle events
  • RenderDayCell for custom styling
  • Method return types and parameters
📄 阅读: references/events-and-methods.md
  • 事件处理(change、select、rangeSelected、open、close)
  • 范围选择事件详情(startDate、endDate、daySpan)
  • 程序化方法(show()、hide()、getSelectedRange())
  • 创建与销毁生命周期事件
  • 用于自定义样式的RenderDayCell
  • 方法返回类型与参数

Date Formatting & Constraints

日期格式化与约束

📄 Read: references/date-formatting-and-constraints.md
  • Date format patterns and separators
  • Multiple format support (format and inputFormats)
  • Min/max date constraints
  • Min/max days validation
  • Disabled dates configuration
  • Format error handling
  • Locale-specific formats
📄 阅读: references/date-formatting-and-constraints.md
  • 日期格式模式与分隔符
  • 多格式支持(format和inputFormats)
  • 最小/最大日期约束
  • 最小/最大天数验证
  • 禁用日期配置
  • 格式错误处理
  • 区域特定格式

Keyboard Navigation & Accessibility

键盘导航与无障碍

📄 Read: references/keyboard-navigation-and-accessibility.md
  • Tab and Shift+Tab navigation
  • Arrow keys for date navigation
  • Enter for range selection and confirmation
  • Escape to close picker
  • Alt key shortcuts
  • Screen reader compatibility
  • ARIA labels and roles
  • WCAG 2.2 AA compliance
  • Focus management
📄 阅读: references/keyboard-navigation-and-accessibility.md
  • Tab和Shift+Tab导航
  • 方向键日期导航
  • 回车确认范围选择
  • Escape关闭选择器
  • Alt快捷键
  • 屏幕阅读器兼容性
  • ARIA标签与角色
  • WCAG 2.2 AA级合规
  • 焦点管理

Styling & Customization

样式与自定义

📄 Read: references/styling-and-customization.md
  • CSS class customization (.e-daterangepicker, .e-calendar, .e-range-header)
  • Theme selection (Material, Bootstrap, Tailwind, Fabric)
  • Dark mode implementation
  • Custom day cell styling via renderDayCell
  • Disabled date styling
  • Preset button styling
  • Hover and focus states
  • Responsive layout customization
📄 阅读: references/styling-and-customization.md
  • CSS类自定义(.e-daterangepicker、.e-calendar、.e-range-header)
  • 主题选择(Material、Bootstrap、Tailwind、Fabric)
  • 深色模式实现
  • 通过renderDayCell自定义日期单元格样式
  • 禁用日期样式
  • 预设按钮样式
  • 悬停与焦点状态
  • 响应式布局自定义

Globalization & Localization

全球化与本地化

📄 Read: references/globalization-and-localization.md
  • Locale property for date formatting
  • RTL (Right-to-Left) support for Arabic, Hebrew
  • Day header formats (Short, Narrow, Abbreviated, Wide)
  • Month names and day names localization
  • Custom locale support
  • Timezone handling
  • Date format localization
📄 阅读: references/globalization-and-localization.md
  • 用于日期格式化的locale属性
  • 支持阿拉伯语、希伯来语的RTL(从右到左)布局
  • 星期表头格式(短格式、窄格式、缩写、全格式)
  • 月份与星期名称本地化
  • 自定义区域支持
  • 时区处理
  • 日期格式本地化

API Reference

API参考

📄 Read: references/api-reference.md
  • Complete property reference with descriptions
  • All method signatures with return types
  • Event argument types and structures
  • Type interfaces (RangeEventArgs, NavigatingEventArgs, etc.)
  • CSS classes and styling hooks
  • Browser support matrix
📄 阅读: references/api-reference.md
  • 完整属性参考与说明
  • 所有带返回类型的方法签名
  • 事件参数类型与结构
  • 类型接口(RangeEventArgs、NavigatingEventArgs等)
  • CSS类与样式钩子
  • 浏览器支持矩阵

Quick Start Example

快速开始示例

typescript
// app.component.ts
import { Component } from '@angular/core';
import { RangeEventArgs } from '@syncfusion/ej2-calendars';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  // Date range properties
  startDate: Date = new Date(2026, 2, 1);  // March 1, 2026
  endDate: Date = new Date(2026, 2, 31);   // March 31, 2026
  
  // Constraints
  minDate: Date = new Date(2020, 0, 1);
  maxDate: Date = new Date(2030, 11, 31);
  
  // Range display
  selectedRange: string = '';
  
  // Event handler
  onRangeChange(args: RangeEventArgs): void {
    console.log('Start Date:', args.startDate);
    console.log('End Date:', args.endDate);
    console.log('Days in range:', args.daySpan);
    this.updateRangeDisplay();
  }
  
  updateRangeDisplay(): void {
    if (this.startDate && this.endDate) {
      const start = this.startDate.toLocaleDateString();
      const end = this.endDate.toLocaleDateString();
      this.selectedRange = `${start} - ${end}`;
    }
  }
}
html
<!-- app.component.html -->
<div style="padding: 20px; font-family: Arial, sans-serif;">
  <h2>DateRangePicker Example</h2>
  
  <div style="margin-bottom: 20px;">
    <label for="dateRange">Select Date Range:</label>
    <ejs-daterangepicker 
      id="dateRange"
      placeholder="Select a date range"
      [startDate]="startDate"
      [endDate]="endDate"
      [min]="minDate"
      [max]="maxDate"
      (change)="onRangeChange($event)">
    </ejs-daterangepicker>
  </div>
  
  <div *ngIf="selectedRange" style="padding: 10px; background-color: #f0f0f0;">
    <p><strong>Selected Range:</strong> {{ selectedRange }}</p>
  </div>
</div>
css
/* app.component.css */
@import '../node_modules/@syncfusion/ej2-base/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-inputs/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-buttons/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-popups/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-calendars/styles/material3.css';

:host ::ng-deep .e-daterangepicker {
  margin: 10px 0;
  width: 100%;
}

:host ::ng-deep .e-range-header {
  background-color: #3f51b5;
  color: white;
}
typescript
// app.component.ts
import { Component } from '@angular/core';
import { RangeEventArgs } from '@syncfusion/ej2-calendars';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  // Date range properties
  startDate: Date = new Date(2026, 2, 1);  // March 1, 2026
  endDate: Date = new Date(2026, 2, 31);   // March 31, 2026
  
  // Constraints
  minDate: Date = new Date(2020, 0, 1);
  maxDate: Date = new Date(2030, 11, 31);
  
  // Range display
  selectedRange: string = '';
  
  // Event handler
  onRangeChange(args: RangeEventArgs): void {
    console.log('Start Date:', args.startDate);
    console.log('End Date:', args.endDate);
    console.log('Days in range:', args.daySpan);
    this.updateRangeDisplay();
  }
  
  updateRangeDisplay(): void {
    if (this.startDate && this.endDate) {
      const start = this.startDate.toLocaleDateString();
      const end = this.endDate.toLocaleDateString();
      this.selectedRange = `${start} - ${end}`;
    }
  }
}
html
<!-- app.component.html -->
<div style="padding: 20px; font-family: Arial, sans-serif;">
  <h2>DateRangePicker Example</h2>
  
  <div style="margin-bottom: 20px;">
    <label for="dateRange">Select Date Range:</label>
    <ejs-daterangepicker 
      id="dateRange"
      placeholder="Select a date range"
      [startDate]="startDate"
      [endDate]="endDate"
      [min]="minDate"
      [max]="maxDate"
      (change)="onRangeChange($event)">
    </ejs-daterangepicker>
  </div>
  
  <div *ngIf="selectedRange" style="padding: 10px; background-color: #f0f0f0;">
    <p><strong>Selected Range:</strong> {{ selectedRange }}</p>
  </div>
</div>
css
/* app.component.css */
@import '../node_modules/@syncfusion/ej2-base/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-inputs/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-buttons/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-popups/styles/material3.css';
@import '../node_modules/@syncfusion/ej2-calendars/styles/material3.css';

:host ::ng-deep .e-daterangepicker {
  margin: 10px 0;
  width: 100%;
}

:host ::ng-deep .e-range-header {
  background-color: #3f51b5;
  color: white;
}

Common Patterns

常见模式

Pattern 1: Preset Date Ranges

模式1:预设日期范围

Quick selection buttons for common date ranges:
typescript
export class AppComponent {
  presets: any[] = [
    { label: 'Today', start: new Date(), end: new Date() },
    { label: 'Last 7 Days', start: this.getDateDaysAgo(7), end: new Date() },
    { label: 'Last 30 Days', start: this.getDateDaysAgo(30), end: new Date() },
    { label: 'This Month', start: this.getFirstDayOfMonth(), end: new Date() },
    { label: 'Last Month', start: this.getFirstDayOfLastMonth(), end: this.getLastDayOfLastMonth() }
  ];
  
  startDate: Date = new Date();
  endDate: Date = new Date();
  
  selectPreset(preset: any): void {
    this.startDate = preset.start;
    this.endDate = preset.end;
  }
  
  private getDateDaysAgo(days: number): Date {
    const date = new Date();
    date.setDate(date.getDate() - days);
    return date;
  }
  
  private getFirstDayOfMonth(): Date {
    return new Date(new Date().getFullYear(), new Date().getMonth(), 1);
  }
  
  private getFirstDayOfLastMonth(): Date {
    const date = new Date();
    return new Date(date.getFullYear(), date.getMonth() - 1, 1);
  }
  
  private getLastDayOfLastMonth(): Date {
    const date = new Date();
    return new Date(date.getFullYear(), date.getMonth(), 0);
  }
}
html
<div>
  <div style="margin-bottom: 10px;">
    <button *ngFor="let preset of presets" 
            (click)="selectPreset(preset)"
            style="margin-right: 5px; padding: 8px 12px;">
      {{ preset.label }}
    </button>
  </div>
  
  <ejs-daterangepicker 
    [startDate]="startDate"
    [endDate]="endDate">
  </ejs-daterangepicker>
</div>
常用日期范围的快速选择按钮:
typescript
export class AppComponent {
  presets: any[] = [
    { label: 'Today', start: new Date(), end: new Date() },
    { label: 'Last 7 Days', start: this.getDateDaysAgo(7), end: new Date() },
    { label: 'Last 30 Days', start: this.getDateDaysAgo(30), end: new Date() },
    { label: 'This Month', start: this.getFirstDayOfMonth(), end: new Date() },
    { label: 'Last Month', start: this.getFirstDayOfLastMonth(), end: this.getLastDayOfLastMonth() }
  ];
  
  startDate: Date = new Date();
  endDate: Date = new Date();
  
  selectPreset(preset: any): void {
    this.startDate = preset.start;
    this.endDate = preset.end;
  }
  
  private getDateDaysAgo(days: number): Date {
    const date = new Date();
    date.setDate(date.getDate() - days);
    return date;
  }
  
  private getFirstDayOfMonth(): Date {
    return new Date(new Date().getFullYear(), new Date().getMonth(), 1);
  }
  
  private getFirstDayOfLastMonth(): Date {
    const date = new Date();
    return new Date(date.getFullYear(), date.getMonth() - 1, 1);
  }
  
  private getLastDayOfLastMonth(): Date {
    const date = new Date();
    return new Date(date.getFullYear(), date.getMonth(), 0);
  }
}
html
<div>
  <div style="margin-bottom: 10px;">
    <button *ngFor="let preset of presets" 
            (click)="selectPreset(preset)"
            style="margin-right: 5px; padding: 8px 12px;">
      {{ preset.label }}
    </button>
  </div>
  
  <ejs-daterangepicker 
    [startDate]="startDate"
    [endDate]="endDate">
  </ejs-daterangepicker>
</div>

Pattern 2: Date Range Validation

模式2:日期范围验证

Validate date ranges with custom constraints:
typescript
export class AppComponent {
  @ViewChild('daterangepicker') drp!: DateRangePickerComponent;
  
  startDate: Date = new Date();
  endDate: Date = new Date();
  rangeError: string = '';
  
  minDate: Date = new Date(2020, 0, 1);
  maxDate: Date = new Date(2030, 11, 31);
  minDays: number = 1;      // At least 1 day
  maxDays: number = 90;     // At most 90 days
  
  onRangeChange(args: RangeEventArgs): void {
    this.rangeError = '';
    
    // Validate date range
    if (args.daySpan < this.minDays) {
      this.rangeError = `Range must be at least ${this.minDays} day(s)`;
      return;
    }
    
    if (args.daySpan > this.maxDays) {
      this.rangeError = `Range cannot exceed ${this.maxDays} days`;
      return;
    }
    
    this.startDate = args.startDate;
    this.endDate = args.endDate;
  }
  
  isRangeValid(): boolean {
    return this.rangeError === '';
  }
}
使用自定义约束验证日期范围:
typescript
export class AppComponent {
  @ViewChild('daterangepicker') drp!: DateRangePickerComponent;
  
  startDate: Date = new Date();
  endDate: Date = new Date();
  rangeError: string = '';
  
  minDate: Date = new Date(2020, 0, 1);
  maxDate: Date = new Date(2030, 11, 31);
  minDays: number = 1;      // At least 1 day
  maxDays: number = 90;     // At most 90 days
  
  onRangeChange(args: RangeEventArgs): void {
    this.rangeError = '';
    
    // Validate date range
    if (args.daySpan < this.minDays) {
      this.rangeError = `Range must be at least ${this.minDays} day(s)`;
      return;
    }
    
    if (args.daySpan > this.maxDays) {
      this.rangeError = `Range cannot exceed ${this.maxDays} days`;
      return;
    }
    
    this.startDate = args.startDate;
    this.endDate = args.endDate;
  }
  
  isRangeValid(): boolean {
    return this.rangeError === '';
  }
}

Pattern 3: Reactive Form Integration

模式3:响应式表单集成

Integrate DateRangePicker with Reactive Forms:
typescript
export class AppComponent implements OnInit {
  reportForm: FormGroup;
  
  constructor(private fb: FormBuilder) {
    this.reportForm = this.fb.group({
      reportName: ['', Validators.required],
      startDate: [new Date(2026, 0, 1), Validators.required],
      endDate: [new Date(), Validators.required]
    });
  }
  
  ngOnInit(): void {
    this.reportForm.get('startDate')?.valueChanges.subscribe(date => {
      console.log('Start date changed:', date);
      this.validateDateRange();
    });
    
    this.reportForm.get('endDate')?.valueChanges.subscribe(date => {
      console.log('End date changed:', date);
      this.validateDateRange();
    });
  }
  
  validateDateRange(): void {
    const start = this.reportForm.get('startDate')?.value;
    const end = this.reportForm.get('endDate')?.value;
    
    if (start && end && start > end) {
      this.reportForm.get('endDate')?.setErrors({ 'invalidRange': true });
    } else {
      this.reportForm.get('endDate')?.setErrors(null);
    }
  }
  
  submitForm(): void {
    if (this.reportForm.valid) {
      console.log('Form values:', this.reportForm.value);
    }
  }
}
html
<form [formGroup]="reportForm" (ngSubmit)="submitForm()">
  <div>
    <label>Report Name:</label>
    <ejs-textbox 
      formControlName="reportName"
      placeholder="Enter report name">
    </ejs-textbox>
  </div>
  
  <div>
    <label>Report Period:</label>
    <ejs-daterangepicker 
      [formControl]="reportForm.get('startDate')"
      [endDate]="reportForm.get('endDate')?.value">
    </ejs-daterangepicker>
  </div>
  
  <button type="submit" [disabled]="!reportForm.valid">Generate Report</button>
</form>
将DateRangePicker与响应式表单集成:
typescript
export class AppComponent implements OnInit {
  reportForm: FormGroup;
  
  constructor(private fb: FormBuilder) {
    this.reportForm = this.fb.group({
      reportName: ['', Validators.required],
      startDate: [new Date(2026, 0, 1), Validators.required],
      endDate: [new Date(), Validators.required]
    });
  }
  
  ngOnInit(): void {
    this.reportForm.get('startDate')?.valueChanges.subscribe(date => {
      console.log('Start date changed:', date);
      this.validateDateRange();
    });
    
    this.reportForm.get('endDate')?.valueChanges.subscribe(date => {
      console.log('End date changed:', date);
      this.validateDateRange();
    });
  }
  
  validateDateRange(): void {
    const start = this.reportForm.get('startDate')?.value;
    const end = this.reportForm.get('endDate')?.value;
    
    if (start && end && start > end) {
      this.reportForm.get('endDate')?.setErrors({ 'invalidRange': true });
    } else {
      this.reportForm.get('endDate')?.setErrors(null);
    }
  }
  
  submitForm(): void {
    if (this.reportForm.valid) {
      console.log('Form values:', this.reportForm.value);
    }
  }
}
html
<form [formGroup]="reportForm" (ngSubmit)="submitForm()">
  <div>
    <label>Report Name:</label>
    <ejs-textbox 
      formControlName="reportName"
      placeholder="Enter report name">
    </ejs-textbox>
  </div>
  
  <div>
    <label>Report Period:</label>
    <ejs-daterangepicker 
      [formControl]="reportForm.get('startDate')"
      [endDate]="reportForm.get('endDate')?.value">
    </ejs-daterangepicker>
  </div>
  
  <button type="submit" [disabled]="!reportForm.valid">Generate Report</button>
</form>

Pattern 4: Dynamic Range Constraints

模式4:动态范围约束

Update range constraints based on business logic:
typescript
export class AppComponent {
  startDate: Date = new Date();
  endDate: Date = new Date();
  
  // Dynamic constraints
  minDate: Date = new Date();
  maxDate: Date = new Date();
  
  reportType: string = 'daily';
  
  onReportTypeChange(type: string): void {
    this.reportType = type;
    this.updateConstraints();
  }
  
  private updateConstraints(): void {
    const today = new Date();
    
    switch (this.reportType) {
      case 'daily':
        // Last 7 days only
        this.minDate = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
        this.maxDate = today;
        break;
      
      case 'monthly':
        // Last 12 months
        this.minDate = new Date(today.getFullYear() - 1, today.getMonth(), 1);
        this.maxDate = today;
        break;
      
      case 'yearly':
        // Last 5 years
        this.minDate = new Date(today.getFullYear() - 5, 0, 1);
        this.maxDate = today;
        break;
    }
  }
}
根据业务逻辑更新范围约束:
typescript
export class AppComponent {
  startDate: Date = new Date();
  endDate: Date = new Date();
  
  // Dynamic constraints
  minDate: Date = new Date();
  maxDate: Date = new Date();
  
  reportType: string = 'daily';
  
  onReportTypeChange(type: string): void {
    this.reportType = type;
    this.updateConstraints();
  }
  
  private updateConstraints(): void {
    const today = new Date();
    
    switch (this.reportType) {
      case 'daily':
        // Last 7 days only
        this.minDate = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
        this.maxDate = today;
        break;
      
      case 'monthly':
        // Last 12 months
        this.minDate = new Date(today.getFullYear() - 1, today.getMonth(), 1);
        this.maxDate = today;
        break;
      
      case 'yearly':
        // Last 5 years
        this.minDate = new Date(today.getFullYear() - 5, 0, 1);
        this.maxDate = today;
        break;
    }
  }
}

Pattern 5: Disabled Date Ranges

模式5:禁用日期范围

Disable specific date ranges (holidays, blackout dates):
typescript
export class AppComponent {
  disabledRanges: Array<{start: Date, end: Date}> = [
    { start: new Date(2026, 11, 20), end: new Date(2026, 11, 31) }, // Christmas season
    { start: new Date(2026, 0, 1), end: new Date(2026, 0, 3) }      // New Year
  ];
  
  startDate: Date = new Date();
  endDate: Date = new Date();
  
  onRenderDayCell(args: RenderDayCellEventArgs): void {
    // Disable dates in disabled ranges
    for (const range of this.disabledRanges) {
      if (args.date >= range.start && args.date <= range.end) {
        args.isDisabled = true;
        break;
      }
    }
  }
}
禁用特定日期范围(节假日、不可选日期):
typescript
export class AppComponent {
  disabledRanges: Array<{start: Date, end: Date}> = [
    { start: new Date(2026, 11, 20), end: new Date(2026, 11, 31) }, // Christmas season
    { start: new Date(2026, 0, 1), end: new Date(2026, 0, 3) }      // New Year
  ];
  
  startDate: Date = new Date();
  endDate: Date = new Date();
  
  onRenderDayCell(args: RenderDayCellEventArgs): void {
    // Disable dates in disabled ranges
    for (const range of this.disabledRanges) {
      if (args.date >= range.start && args.date <= range.end) {
        args.isDisabled = true;
        break;
      }
    }
  }
}

Key Props Reference

核心属性参考

PropTypeDescriptionExample
startDate
Date
Start date of the range
[startDate]="start"
endDate
Date
End date of the range
[endDate]="end"
value
Date[]
or
DateRange
Selected date range (array or object)
[(ngModel)]="dateRange"
min
Date
Minimum selectable date
[min]="minDate"
max
Date
Maximum selectable date
[max]="maxDate"
minDays
number
Minimum days in range
[minDays]="1"
maxDays
number
Maximum days in range
[maxDays]="90"
format
string
Date display format
format="dd/MM/yyyy"
separator
string
Range separator character
separator=" to "
placeholder
string
Placeholder text
placeholder="Select date range"
presets
PresetsModel[]
Predefined range options
[presets]="presets"
strictMode
boolean
Strict date validation
[strictMode]="true"
readonly
boolean
Read-only input field
[readonly]="false"
enabled
boolean
Enable/disable component
[enabled]="true"
locale
string
Culture/language code
locale="en-US"
enableRtl
boolean
Enable RTL layout
[enableRtl]="false"
cssClass
string
Custom CSS classes
cssClass="custom-drp"
width
number | string
Component width
width="300px"
allowEdit
boolean
Allow manual text input
[allowEdit]="true"
openOnFocus
boolean
Open picker on input focus
[openOnFocus]="true"
showClearButton
boolean
Show clear button
[showClearButton]="true"
depth
CalendarView
Calendar view depth
depth="Month"
属性类型说明示例
startDate
Date
范围的开始日期
[startDate]="start"
endDate
Date
范围的结束日期
[endDate]="end"
value
Date[]
DateRange
选中的日期范围(数组或对象)
[(ngModel)]="dateRange"
min
Date
最小可选日期
[min]="minDate"
max
Date
最大可选日期
[max]="maxDate"
minDays
number
范围最小天数
[minDays]="1"
maxDays
number
范围最大天数
[maxDays]="90"
format
string
日期展示格式
format="dd/MM/yyyy"
separator
string
范围分隔符
separator=" to "
placeholder
string
占位符文本
placeholder="Select date range"
presets
PresetsModel[]
预定义范围选项
[presets]="presets"
strictMode
boolean
严格日期验证
[strictMode]="true"
readonly
boolean
输入框只读
[readonly]="false"
enabled
boolean
启用/禁用组件
[enabled]="true"
locale
string
文化/语言代码
locale="en-US"
enableRtl
boolean
启用RTL布局
[enableRtl]="false"
cssClass
string
自定义CSS类
cssClass="custom-drp"
width
number | string
组件宽度
width="300px"
allowEdit
boolean
允许手动文本输入
[allowEdit]="true"
openOnFocus
boolean
输入框聚焦时打开选择器
[openOnFocus]="true"
showClearButton
boolean
显示清空按钮
[showClearButton]="true"
depth
CalendarView
日历视图层级
depth="Month"

Common Use Cases

常见使用场景

Use Case 1: Report Date Range Selection
  • User selects date range for report generation
  • Apply min/max date constraints
  • Support preset ranges (Last 7 Days, Last Month, etc.)
  • Solution: Combine startDate/endDate with presets and min/max constraints
  • Reference: Preset Ranges + Date Formatting & Constraints
Use Case 2: Booking System Range
  • Select check-in and check-out dates for booking
  • Disable past dates and blackout dates
  • Show day count in range
  • Solution: Use min date constraint, renderDayCell for disabled ranges, calculate daySpan
  • Reference: Date Range Selection + Events & Methods
Use Case 3: Analytics Date Filter
  • Select date range for analytics dashboard
  • Multiple preset options for quick selection
  • Responsive mobile-friendly interface
  • Solution: Use presets with responsive styling and touch optimization
  • Reference: Preset Ranges + Styling & Customization
Use Case 4: Accessible Form Field
  • DateRangePicker integrated in form with full keyboard accessibility
  • Screen reader compatible, WCAG 2.2 compliant
  • Solution: Use with Reactive Forms, proper ARIA labels
  • Reference: Keyboard Navigation & Accessibility
Use Case 5: International Date Picker
  • Support multiple languages and date formats
  • Show RTL for Arabic, Hebrew
  • Locale-specific formatting
  • Solution: Use locale property and format customization
  • Reference: Globalization & Localization
场景1:报表日期范围选择
  • 用户选择生成报表的日期范围
  • 应用最小/最大日期约束
  • 支持预设范围(过去7天、上月等)
  • 解决方案:结合startDate/endDate、预设范围和最小/最大约束
  • 参考:预设范围 + 日期格式化与约束
场景2:预订系统范围选择
  • 选择预订的入住和退房日期
  • 禁用过去日期和不可选日期
  • 展示范围包含的天数
  • 解决方案:使用最小日期约束、renderDayCell配置禁用范围、计算daySpan
  • 参考:日期范围选择 + 事件与方法
场景3:分析数据日期筛选
  • 为分析看板选择日期范围
  • 多预设选项支持快速选择
  • 响应式移动端友好界面
  • 解决方案:使用预设范围搭配响应式样式和触控优化
  • 参考:预设范围 + 样式与自定义
场景4:无障碍表单字段
  • DateRangePicker集成到表单中,支持全键盘操作
  • 兼容屏幕阅读器,符合WCAG 2.2标准
  • 解决方案:结合响应式表单使用,配置正确的ARIA标签
  • 参考:键盘导航与无障碍
场景5:国际化日期选择器
  • 支持多语言和多日期格式
  • 为阿拉伯语、希伯来语展示RTL布局
  • 区域特定格式化
  • 解决方案:使用locale属性和自定义格式
  • 参考:全球化与本地化

Related Skills

相关技能

  • Implementing Syncfusion Angular Components - Main library guide for all Angular components
  • Calendar - Single calendar component for date selection
  • DatePicker - Single date picker with calendar overlay
  • DateTimePicker - Date and time selection combined
  • TimePicker - Time selection component

Next Steps: Choose a reference guide above based on your specific needs, or explore the common patterns section for your use case.
  • 实现Syncfusion Angular组件 - 所有Angular组件的主库指南
  • 日历 - 用于日期选择的单日历组件
  • DatePicker - 带日历浮层的单日期选择器
  • DateTimePicker - 合并日期和时间选择能力
  • TimePicker - 时间选择组件

后续步骤: 根据你的具体需求选择上面的参考指南,或者查看常见模式部分匹配你的使用场景。