3天精通bootstrap-datepicker:打造专业级日期选择体验的终极指南

张开发
2026/4/18 1:45:04 15 分钟阅读

分享文章

3天精通bootstrap-datepicker:打造专业级日期选择体验的终极指南
3天精通bootstrap-datepicker打造专业级日期选择体验的终极指南【免费下载链接】bootstrap-datepickerA datepicker for twitter bootstrap (twbs)项目地址: https://gitcode.com/gh_mirrors/bo/bootstrap-datepicker还在为网页中的日期输入问题而烦恼吗用户输入格式混乱、日期验证复杂、跨浏览器兼容性差——这些痛点是否也困扰着你今天我要为你介绍一个能够彻底解决这些问题的神器bootstrap-datepicker。作为Bootstrap生态中最受欢迎的日期选择插件它以其轻量级设计、丰富的功能配置和卓越的兼容性成为Web开发中处理日期输入的首选方案。想象一下只需几行代码就能实现专业级的日期选择功能支持50多种语言提供4种不同的UI样式还能轻松定制日期限制、高亮显示和多日期选择。无论你是前端新手还是资深开发者掌握bootstrap-datepicker都能让你的开发效率提升数倍为用户带来极致的日期选择体验。为什么选择bootstrap-datepicker在众多日期选择插件中bootstrap-datepicker凭借以下核心优势脱颖而出轻量级设计仅需jQuery和Bootstrap作为依赖文件体积小巧加载速度快无缝集成完美融入Bootstrap设计体系UI风格一致无需额外样式调整功能全面从基础日期选择到高级定制满足各种业务场景需求跨浏览器兼容支持所有主流浏览器包括IE8、Chrome、Firefox、Safari等多语言支持内置50种语言包轻松实现国际化响应式设计完美适配桌面端和移动端设备快速启动5分钟完成集成让我们从最简单的开始。首先你需要准备基础环境# 克隆项目到本地 git clone https://gitcode.com/gh_mirrors/bo/bootstrap-datepicker.git cd bootstrap-datepicker # 安装依赖 npm install # 构建生产版本 grunt dist如果你只是想快速体验可以直接使用CDN方式!-- 基础依赖 -- link hrefhttps://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css relstylesheet script srchttps://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js/script script srchttps://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js/script !-- bootstrap-datepicker核心文件 -- link hrefhttps://cdn.bootcdn.net/ajax/libs/bootstrap-datepicker/1.9.0/css/bootstrap-datepicker.min.css relstylesheet script srchttps://cdn.bootcdn.net/ajax/libs/bootstrap-datepicker/1.9.0/js/bootstrap-datepicker.min.js/script !-- 中文语言包可选 -- script srchttps://cdn.bootcdn.net/ajax/libs/bootstrap-datepicker/1.9.0/locales/bootstrap-datepicker.zh-CN.min.js/script四种UI样式选择最适合你的交互方式bootstrap-datepicker提供四种不同的UI样式每种都针对特定的使用场景进行了优化。让我们一起来看看它们的特点和适用场景。1. 输入框式最简洁的选择这是最基本的实现方式适合大多数表单场景input typetext classform-control idsimple-datepicker placeholder请选择日期 script $(function() { $(#simple-datepicker).datepicker({ format: yyyy-mm-dd, autoclose: true, todayHighlight: true }); }); /script适用场景简单的日期输入、搜索表单、用户注册等基础场景。2. 组件式带触发按钮的专业体验如果你希望提供更明确的触发机制组件式是理想选择div classinput-group date idcomponent-datepicker input typetext classform-control value2025-09-14 div classinput-group-addon span classglyphicon glyphicon-calendar/span /div /div script $(#component-datepicker).datepicker({ format: yyyy-mm-dd, autoclose: true }); /script优势明确的触发按钮、更好的视觉反馈、符合Bootstrap组件规范。3. 日期范围选择业务场景必备对于需要选择时间段的业务场景日期范围选择器是刚需div classinput-group input-daterange idrange-datepicker input typetext classform-control namestart placeholder开始日期 div classinput-group-addon至/div input typetext classform-control nameend placeholder结束日期 /div script $(#range-datepicker).datepicker({ format: yyyy-mm-dd, autoclose: true, todayHighlight: true }); /script业务场景酒店预订、报表统计、任务时间安排、数据分析等需要时间范围的场景。4. 嵌入式始终可见的日历如果你希望日历始终显示在页面上嵌入式是最佳选择div idinline-datepicker>// 中文格式 $(#datepicker).datepicker({ format: yyyy年mm月dd日 }); // ISO标准格式 $(#datepicker).datepicker({ format: yyyy-mm-dd }); // 带星期几的格式 $(#datepicker).datepicker({ format: yyyy-mm-dd D }); // 美国常用格式 $(#datepicker).datepicker({ format: mm/dd/yyyy });格式占位符速查表占位符含义示例yyyy4位年份2025yy2位年份25mm2位月份09m月份无前导零9MM月份全称SeptemberM月份缩写Sepdd2位日期14d日期无前导零14D星期几缩写MonDD星期几全称Monday日期限制精确控制可选范围在实际业务中我们经常需要限制用户的选择范围。bootstrap-datepicker提供了多种限制方式// 只能选择今天及以后的日期 $(#datepicker).datepicker({ startDate: today }); // 限制在特定时间段内 $(#datepicker).datepicker({ startDate: 2025-01-01, endDate: 2025-12-31 }); // 相对日期限制昨天到今天 $(#datepicker).datepicker({ startDate: -1d, endDate: today }); // 禁用周末 $(#datepicker).datepicker({ daysOfWeekDisabled: [0, 6] // 0周日6周六 }); // 禁用特定日期 $(#datepicker).datepicker({ datesDisabled: [2025-10-01, 2025-12-25] });交互增强提升用户体验的细节// 选择后自动关闭 $(#datepicker).datepicker({ autoclose: true }); // 显示今天按钮并高亮今天 $(#datepicker).datepicker({ todayBtn: true, todayHighlight: true }); // 显示清除按钮 $(#datepicker).datepicker({ clearBtn: true }); // 显示周数适合项目管理 $(#datepicker).datepicker({ calendarWeeks: true });高级功能实战解决复杂业务需求多日期选择灵活应对多种场景// 无限制多选 $(#datepicker).datepicker({ multidate: true }); // 限制最多选择3个日期 $(#datepicker).datepicker({ multidate: 3 }); // 获取已选择的多个日期 var selectedDates $(#datepicker).datepicker(getDates); selectedDates.forEach(function(date) { console.log(已选择日期, date.toLocaleDateString()); });应用场景会议安排、课程选择、活动报名等需要选择多个不连续日期的场景。自定义日期状态业务规则可视化通过beforeShowDay回调函数你可以完全控制每一天的显示状态// 自定义节假日和特殊日期 var holidays [2025-01-01, 2025-10-01]; // 法定节假日 var specialDays [2025-02-14, 2025-12-25]; // 特殊节日 $(#datepicker).datepicker({ beforeShowDay: function(date) { var dateStr $.fn.datepicker.DPGlobal.formatDate(date, yyyy-mm-dd, en); // 检查是否为节假日 if ($.inArray(dateStr, holidays) ! -1) { return { enabled: false, classes: disabled-day, tooltip: 法定节假日不可选择 }; } // 检查是否为特殊节日 if ($.inArray(dateStr, specialDays) ! -1) { return { enabled: true, classes: special-day, tooltip: 特殊节日 }; } // 检查是否为周末 var day date.getDay(); if (day 0 || day 6) { return { enabled: true, classes: weekend-day, tooltip: 周末 }; } return true; } }); // CSS样式 style .disabled-day { background-color: #f5f5f5; color: #ccc; cursor: not-allowed; } .special-day { background-color: #ffebee; color: #d32f2f; } .weekend-day { color: #1976d2; } /style视图层级控制简化用户操作// 只能在月份视图选择不能切换年份 $(#datepicker).datepicker({ minViewMode: 0, // 0月1年2十年 maxViewMode: 0 }); // 只能在年份视图选择 $(#datepicker).datepicker({ minViewMode: 1, maxViewMode: 1 }); // 初始显示年份视图 $(#datepicker).datepicker({ startView: 1 // 0月1年2十年 });国际化支持打造全球化的应用bootstrap-datepicker支持50多种语言让你的应用轻松走向世界// 使用中文 $(#datepicker).datepicker({ language: zh-CN }); // 使用英文 $(#datepicker).datepicker({ language: en }); // 动态切换语言 function changeLanguage(lang) { $(#datepicker).datepicker(option, language, lang); } // 自定义语言如果内置语言不满足需求 $.fn.datepicker.dates[custom] { days: [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六], daysShort: [日, 一, 二, 三, 四, 五, 六], daysMin: [日, 一, 二, 三, 四, 五, 六], months: [一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月], monthsShort: [一, 二, 三, 四, 五, 六, 七, 八, 九, 十, 十一, 十二], today: 今天, clear: 清除, format: yyyy-mm-dd, titleFormat: yyyy年MM月, weekStart: 1 // 从周一开始 }; $(#datepicker).datepicker({ language: custom });实战案例构建企业级日期选择功能案例1酒店预订系统酒店预订系统需要处理复杂的日期逻辑包括入住和离店日期的联动、最少/最多入住天数限制、节假日处理等div classrow div classcol-md-6 div classform-group label入住日期/label div classinput-group date idcheckin-datepicker input typetext classform-control namecheckin placeholder选择入住日期 div classinput-group-addon span classglyphicon glyphicon-calendar/span /div /div /div /div div classcol-md-6 div classform-group label离店日期/label div classinput-group date idcheckout-datepicker input typetext classform-control namecheckout placeholder选择离店日期 div classinput-group-addon span classglyphicon glyphicon-calendar/span /div /div /div /div /div div classalert alert-success idbooking-info 请选择入住和离店日期 /div// 酒店节假日示例 var hotelHolidays [ 2025-01-01, 2025-01-02, // 元旦 2025-01-28, 2025-01-29, 2025-01-30, // 春节 2025-10-01, 2025-10-02, 2025-10-03 // 国庆 ]; // 入住日期选择器 $(#checkin-datepicker).datepicker({ format: yyyy-mm-dd, startDate: today, autoclose: true, todayHighlight: true, beforeShowDay: function(date) { var dateStr $.fn.datepicker.DPGlobal.formatDate(date, yyyy-mm-dd, en); // 禁用节假日 if ($.inArray(dateStr, hotelHolidays) ! -1) { return false; } return true; } }).on(changeDate, function(e) { var checkinDate e.date; var minCheckoutDate new Date(checkinDate); minCheckoutDate.setDate(minCheckoutDate.getDate() 1); // 更新离店日期的最小值 $(#checkout-datepicker).datepicker(setStartDate, minCheckoutDate); calculateStayDays(); }); // 离店日期选择器 $(#checkout-datepicker).datepicker({ format: yyyy-mm-dd, autoclose: true, beforeShowDay: function(date) { var dateStr $.fn.datepicker.DPGlobal.formatDate(date, yyyy-mm-dd, en); // 禁用节假日 if ($.inArray(dateStr, hotelHolidays) ! -1) { return false; } return true; } }).on(changeDate, function() { calculateStayDays(); }); // 计算入住天数 function calculateStayDays() { var checkin $(input[namecheckin]).val(); var checkout $(input[namecheckout]).val(); if (checkin checkout) { var start new Date(checkin); var end new Date(checkout); var days Math.ceil((end - start) / (1000 * 60 * 60 * 24)); if (days 1) { $(#booking-info).removeClass(alert-success).addClass(alert-danger) .text(离店日期必须晚于入住日期); return; } if (days 30) { $(#booking-info).removeClass(alert-success).addClass(alert-warning) .text(最多可预订30天已自动调整为30天); var maxDate new Date(start); maxDate.setDate(start.getDate() 30); $(#checkout-datepicker).datepicker(setDate, maxDate); days 30; } var price days * 299; // 假设每天299元 $(#booking-info).removeClass(alert-danger alert-warning).addClass(alert-success) .html(预订成功br入住天数${days}晚br总价strong¥${price}/strong); } }案例2项目管理时间线项目管理中经常需要设置任务的开始和结束日期并确保时间线合理// 项目任务日期选择器 var projectStartDate null; $(#task-start-date).datepicker({ format: yyyy-mm-dd, autoclose: true, todayHighlight: true }).on(changeDate, function(e) { projectStartDate e.date; // 设置结束日期的最早可选日期为开始日期的第二天 var minEndDate new Date(projectStartDate); minEndDate.setDate(minEndDate.getDate() 1); $(#task-end-date).datepicker(setStartDate, minEndDate); // 如果结束日期早于新的开始日期则重置结束日期 var currentEndDate $(#task-end-date).datepicker(getDate); if (currentEndDate currentEndDate minEndDate) { $(#task-end-date).datepicker(setDate, minEndDate); } calculateTaskDuration(); }); $(#task-end-date).datepicker({ format: yyyy-mm-dd, autoclose: true }).on(changeDate, function() { calculateTaskDuration(); }); function calculateTaskDuration() { var start $(#task-start-date).datepicker(getDate); var end $(#task-end-date).datepicker(getDate); if (start end) { var days Math.ceil((end - start) / (1000 * 60 * 60 * 24)); if (days 0) { $(#duration-display).text(任务周期${days}天); } else { $(#duration-display).text(结束日期必须晚于开始日期); } } }性能优化与最佳实践1. 延迟加载优化对于页面中非首屏的日期选择器可以使用延迟加载提升性能// 使用IntersectionObserver实现延迟加载 var datepickerObserver new IntersectionObserver(function(entries) { entries.forEach(function(entry) { if (entry.isIntersecting) { $(entry.target).datepicker({ format: yyyy-mm-dd, autoclose: true }); datepickerObserver.unobserve(entry.target); } }); }, { threshold: 0.1 // 当元素10%进入视口时触发 }); // 为所有需要延迟加载的日期选择器添加观察 $(.lazy-datepicker).each(function() { datepickerObserver.observe(this); });2. 共享配置对象当页面中有多个相同配置的日期选择器时共享配置对象可以减少内存占用// 创建共享配置 var commonDatepickerOptions { format: yyyy-mm-dd, autoclose: true, todayHighlight: true, weekStart: 1, language: zh-CN }; // 应用共享配置 $(.datepicker-default).datepicker(commonDatepickerOptions); // 个别定制继承并覆盖 $(.datepicker-special).datepicker($.extend({}, commonDatepickerOptions, { startDate: today, endDate: 30d }));3. 事件委托处理动态元素对于动态生成的元素使用事件委托可以避免重复绑定事件// 使用事件委托处理动态生成的日期选择器 $(document).on(focus, .dynamic-datepicker, function() { if (!$(this).data(datepicker)) { $(this).datepicker({ format: yyyy-mm-dd, autoclose: true }).datepicker(show); } });4. 内存管理及时销毁不再使用的日期选择器实例避免内存泄漏// 在模态框关闭时销毁日期选择器 $(#myModal).on(hidden.bs.modal, function() { $(.modal-datepicker).datepicker(destroy); }); // 在标签页切换时销毁隐藏的日期选择器 $(a[data-toggletab]).on(shown.bs.tab, function(e) { var target $(e.target).attr(href); // 销毁所有非活动标签页中的日期选择器 $(.tab-pane:not( target ) .datepicker).each(function() { if ($(this).data(datepicker)) { $(this).datepicker(destroy); } }); // 初始化活动标签页中的日期选择器 $(target .datepicker).datepicker({ format: yyyy-mm-dd, autoclose: true }); });常见问题与解决方案问题1在模态框中显示异常症状日期选择器弹出框出现在模态框下方或被遮挡。解决方案$(#modal-datepicker).datepicker({ container: #myModal // 指定容器为模态框 });问题2移动端体验不佳症状在移动设备上点击输入框时同时弹出日期选择器和虚拟键盘。解决方案$(.datepicker).datepicker({ disableTouchKeyboard: true, // 禁用触摸键盘 todayHighlight: true, autoclose: true });移动端优化CSSmedia (max-width: 768px) { .datepicker { width: 100% !important; font-size: 16px !important; /* 防止iOS缩放 */ } .datepicker-dropdown { position: fixed !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%); width: 90% !important; max-width: 400px; } }问题3日期格式转换问题症状从字符串转换为Date对象时出现时区问题。解决方案// 使用内置的格式化方法 var dateStr 2025-09-14; var dateObj $.fn.datepicker.DPGlobal.parseDate(dateStr, yyyy-mm-dd, en); // 或者使用UTC日期 var utcDate new Date(Date.UTC(2025, 8, 14)); // 注意月份从0开始 // 格式化输出 var formatted $.fn.datepicker.DPGlobal.formatDate(utcDate, yyyy年mm月dd日, zh-CN);问题4与其他插件冲突症状bootstrap-datepicker与其他jQuery插件或框架冲突。解决方案// 使用noConflict模式 var datepicker $.fn.datepicker.noConflict(); $.fn.bootstrapDatepicker datepicker; // 使用新的别名 $(#myDatepicker).bootstrapDatepicker({ format: yyyy-mm-dd }); // 或者在特定范围内恢复 (function($) { // 在这里使用$作为jQuery $(#myDatepicker).datepicker({ format: yyyy-mm-dd }); })(jQuery);进阶技巧自定义扩展与集成自定义主题样式bootstrap-datepicker支持完全自定义样式你可以创建自己的主题/* 自定义日期选择器主题 */ .custom-datepicker .datepicker { border-radius: 8px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); } .custom-datepicker .datepicker-days table tr td.day:hover { background-color: #4CAF50; color: white; } .custom-datepicker .datepicker-days table tr td.active { background-color: #2196F3; color: white; } .custom-datepicker .datepicker-days table tr td.today { background-color: #FF9800; color: white; } .custom-datepicker .datepicker-switch, .custom-datepicker .prev, .custom-datepicker .next { color: #2196F3; font-weight: bold; } .custom-datepicker .datepicker-dropdown:before { border-bottom-color: #2196F3; } .custom-datepicker .datepicker-dropdown:after { border-bottom-color: white; }与Vue.js集成如果你在使用Vue.js可以创建可重用的日期选择器组件// Vue.js日期选择器组件 Vue.component(date-picker, { template: div classinput-group date input typetext classform-control :valuevalue input$emit(input, $event.target.value) :placeholderplaceholder refdatepicker div classinput-group-addon span classglyphicon glyphicon-calendar/span /div /div , props: { value: String, placeholder: { type: String, default: 请选择日期 }, options: { type: Object, default: () ({}) } }, mounted() { const defaultOptions { format: yyyy-mm-dd, autoclose: true, todayHighlight: true, language: zh-CN }; const finalOptions Object.assign({}, defaultOptions, this.options); $(this.$refs.datepicker).datepicker(finalOptions) .on(changeDate, (e) { this.$emit(input, e.format()); }); }, beforeDestroy() { $(this.$refs.datepicker).datepicker(destroy); }, watch: { value(newVal) { if (newVal) { $(this.$refs.datepicker).datepicker(update, newVal); } } } }); // 使用示例 new Vue({ el: #app, data: { selectedDate: }, methods: { handleDateChange(date) { console.log(选择的日期, date); } } });与React集成对于React项目可以创建受控组件import React, { useEffect, useRef } from react; import $ from jquery; import bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css; import bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js; import bootstrap-datepicker/dist/locales/bootstrap-datepicker.zh-CN.min.js; const DatePicker ({ value, onChange, options {} }) { const inputRef useRef(null); useEffect(() { const defaultOptions { format: yyyy-mm-dd, autoclose: true, todayHighlight: true, language: zh-CN }; const finalOptions { ...defaultOptions, ...options }; $(inputRef.current).datepicker(finalOptions) .on(changeDate, (e) { onChange(e.format()); }); return () { $(inputRef.current).datepicker(destroy); }; }, [options, onChange]); useEffect(() { if (value inputRef.current) { $(inputRef.current).datepicker(update, value); } }, [value]); return ( div classNameinput-group date input typetext classNameform-control value{value || } onChange{(e) onChange(e.target.value)} ref{inputRef} placeholder请选择日期 / div classNameinput-group-addon span classNameglyphicon glyphicon-calendar/span /div /div ); }; export default DatePicker;测试与调试技巧单元测试示例使用QUnit进行日期选择器的单元测试QUnit.module(Datepicker Tests, { beforeEach: function() { // 创建测试用的DOM结构 $(#qunit-fixture).html(input typetext idtest-datepicker); this.$input $(#test-datepicker); }, afterEach: function() { // 清理 this.$input.datepicker(destroy); } }); QUnit.test(日期选择器初始化, function(assert) { this.$input.datepicker({ format: yyyy-mm-dd, autoclose: true }); assert.ok(this.$input.data(datepicker), 日期选择器应该被初始化); }); QUnit.test(日期格式设置, function(assert) { this.$input.datepicker({ format: yyyy年mm月dd日 }); this.$input.datepicker(update, 2025-09-14); assert.equal(this.$input.val(), 2025年09月14日, 日期应该被正确格式化); }); QUnit.test(日期范围限制, function(assert) { this.$input.datepicker({ startDate: 2025-01-01, endDate: 2025-12-31 }); var datepicker this.$input.data(datepicker); var beforeDate new Date(2024, 11, 31); // 2024-12-31 var validDate new Date(2025, 5, 15); // 2025-06-15 var afterDate new Date(2026, 0, 1); // 2026-01-01 assert.ok(datepicker.isInRange(validDate), 范围内的日期应该有效); assert.notOk(datepicker.isInRange(beforeDate), 范围前的日期应该无效); assert.notOk(datepicker.isInRange(afterDate), 范围后的日期应该无效); });调试技巧查看日期选择器状态// 获取日期选择器实例 var datepicker $(#myDatepicker).data(datepicker); console.log(当前配置, datepicker.o); console.log(当前视图, datepicker.viewMode); console.log(当前日期, datepicker.date);事件监听调试$(#myDatepicker).datepicker() .on(show, function(e) { console.log(日期选择器显示, e); }) .on(hide, function(e) { console.log(日期选择器隐藏, e); }) .on(changeDate, function(e) { console.log(日期改变, { date: e.date, formatted: e.format(), localDate: e.format(yyyy-mm-dd) }); }) .on(changeMonth, function(e) { console.log(月份改变, e.date); }) .on(changeYear, function(e) { console.log(年份改变, e.date); });总结与进阶学习路径通过本文的学习你已经掌握了bootstrap-datepicker的核心功能和实战技巧。让我们回顾一下关键要点基础掌握四种UI样式选择、日期格式化、基本配置进阶技巧日期限制、多日期选择、自定义日期状态、国际化支持实战应用酒店预订系统、项目管理工具等企业级解决方案性能优化延迟加载、共享配置、内存管理问题解决常见问题排查与解决方案下一步学习建议深入研究源码阅读 js/bootstrap-datepicker.js 文件理解插件内部实现机制探索高级特性查看 docs/options.rst 中的所有配置选项学习本地化研究 js/locales/ 目录下的语言文件了解多语言实现参与测试运行项目中的测试套件理解各种边界情况贡献代码如果你发现了bug或有改进建议可以提交PR到项目仓库最佳实践总结始终设置format选项避免日期解析歧义合理使用autoclose提升用户体验考虑移动端适配使用disableTouchKeyboard和响应式样式及时销毁实例避免内存泄漏使用事件委托处理动态生成的元素做好错误处理验证用户输入提供清晰的错误提示bootstrap-datepicker作为一个成熟稳定的日期选择解决方案已经在无数项目中证明了其价值。无论你是构建简单的表单还是复杂的企业应用它都能提供可靠、灵活的日期选择功能。现在是时候将学到的知识应用到你的项目中了。从简单的日期输入开始逐步尝试更复杂的功能你会发现bootstrap-datepicker能够极大地提升你的开发效率和用户体验。记住最好的学习方式就是实践。打开你的编辑器创建一个新的HTML文件开始你的bootstrap-datepicker之旅吧如果你在实践过程中遇到任何问题可以参考项目中的示例和文档或者在开发者社区中寻求帮助。祝你编码愉快期待看到你创造的精彩应用【免费下载链接】bootstrap-datepickerA datepicker for twitter bootstrap (twbs)项目地址: https://gitcode.com/gh_mirrors/bo/bootstrap-datepicker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章