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

如何在Sencha ExtJS 7.5.1的DatePicker中显示佛历(泰国年)

在Sencha ExtJS 7.5.1中让DatePicker显示佛历(泰国年)

佛历与公历的核心转换规则为:佛历年份 = 公历年份 + 543,月、日保持完全一致(如示例中公历2019-01-31对应佛历2562-01-31)。要实现DatePicker的佛历显示,需覆盖ExtJS默认的日期格式化、解析逻辑,同时调整年份选择器的显示内容,以下是具体实现方案:


方法一:自定义日期工具类(全局复用)

先封装佛历转换的工具方法,再在DatePicker中调用:

1. 编写佛历处理工具类

Ext.define('MyApp.util.ThaiDate', {
    singleton: true,
    // 格式化日期为佛历
    format: function(date, format) {
        var thaiDate = new Date(date.getTime());
        // 替换格式中的年份标识,将公历年份转为佛历
        return Ext.Date.format(thaiDate, format.replace(/Y/g, () => thaiDate.getFullYear() + 543)
                                                .replace(/y/g, () => (thaiDate.getFullYear() + 543).toString().slice(-2)));
    },
    // 解析佛历日期为公历日期
    parse: function(value, format) {
        var yearMatch = value.match(/(\d{4})/);
        if (yearMatch) {
            var gregorianYear = parseInt(yearMatch[0], 10) - 543;
            value = value.replace(yearMatch[0], gregorianYear);
        }
        return Ext.Date.parse(value, format);
    }
});

2. 配置DatePicker使用工具类

Ext.create('Ext.picker.Date', {
    renderTo: Ext.getBody(),
    format: 'Y-m-d', // 佛历显示格式
    value: new Date(2019, 0, 31), // 初始设为公历2019-01-31
    // 重写显示值逻辑,确保显示佛历
    getDisplayValue: function() {
        var value = this.getValue();
        return value ? MyApp.util.ThaiDate.format(value, this.format) : '';
    },
    // 重写输入解析逻辑,支持佛历输入转公历存储
    parseDate: function(value) {
        return MyApp.util.ThaiDate.parse(value, this.format);
    },
    listeners: {
        select: function(picker, date) {
            console.log('佛历日期:', MyApp.util.ThaiDate.format(date, picker.format));
        }
    }
});

方法二:扩展DatePicker组件(批量复用)

如果多个页面需要佛历选择器,直接扩展组件更高效:

1. 扩展佛历DatePicker

Ext.define('MyApp.picker.ThaiDate', {
    extend: 'Ext.picker.Date',
    alias: 'widget.thaidatepicker',
    
    format: 'Y-m-d',
    
    // 重写显示值
    getDisplayValue: function() {
        var value = this.getValue();
        return value ? this.formatToThai(value) : '';
    },
    
    // 重写输入解析
    parseDate: function(value) {
        var yearMatch = value.match(/(\d{4})/);
        if (yearMatch) {
            var gregorianYear = parseInt(yearMatch[0], 10) - 543;
            value = value.replace(yearMatch[0], gregorianYear);
        }
        return this.callParent([value]);
    },
    
    // 自定义佛历格式化方法
    formatToThai: function(date) {
        var thaiYear = date.getFullYear() + 543;
        return `${thaiYear}-${Ext.String.leftPad(date.getMonth()+1,2,'0')}-${Ext.String.leftPad(date.getDate(),2,'0')}`;
    },
    
    // 调整年份选择器显示佛历
    createYearPicker: function() {
        var picker = this.callParent(arguments);
        picker.itemTpl = new Ext.XTemplate('<div class="x-boundlist-item">{[values.year + 543]}</div>');
        return picker;
    }
});

2. 使用扩展后的组件

Ext.create('MyApp.picker.ThaiDate', {
    renderTo: Ext.getBody(),
    value: new Date(2019, 0, 31),
    listeners: {
        select: function(picker) {
            console.log('选中佛历:', picker.getDisplayValue()); // 输出2562-01-31
        }
    }
});

关键注意事项

  • 数据存储始终使用公历日期,仅在显示层转换为佛历,避免后续业务逻辑出错。
  • 若需支持泰文月份名称,可在格式化方法中替换数字月份为泰文,或加载ExtJS泰语本地化包后配置对应格式。
  • 测试边界日期(如公历1月1日),确保跨年转换逻辑稳定。

内容的提问来源于stack exchange,提问作者dekmai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:57:52