轻量级时间选择插件bootstrap-datetimepicker提升开发效率的全方位解决方案【免费下载链接】bootstrap-datetimepicker项目地址: https://gitcode.com/gh_mirrors/boo/bootstrap-datetimepicker在现代Web开发中日期时间选择功能几乎是所有表单系统的标配。但你是否曾遇到过这样的困境引入的时间控件体积庞大导致页面加载缓慢多语言适配时繁琐的配置让你头疼不已或者在移动端使用时出现界面错位这些问题不仅影响开发效率更直接损害用户体验。作为一款基于Bootstrap框架的轻量级前端时间控件bootstrap-datetimepicker以其不足20KB的核心体积、灵活的日期格式化能力和强大的多语言适配功能成为解决这些痛点的理想选择。本文将从实际开发场景出发全面解析这款工具如何帮助开发者快速构建专业级时间选择界面同时提供实用的配置方案和性能优化建议。[场景痛点]: 为什么传统时间控件让开发者头疼在实际项目开发中时间选择功能看似简单实则隐藏着诸多挑战。想象一下这样的场景你正在开发一个跨国电商平台的订单系统需要同时满足不同地区用户的日期格式习惯——美国用户习惯月/日/年欧洲用户偏好日/月/年而中国用户则常用年-月-日。传统解决方案往往需要编写大量自定义代码来处理这些格式转换不仅耗时费力还容易引入兼容性问题。另一个常见痛点是时间范围限制。例如酒店预订系统需要限制用户只能选择未来30天内的日期并且禁止选择过去的时间。实现这种功能通常需要复杂的日期计算和条件判断而普通控件往往缺乏现成的API支持。移动端适配则是另一个棘手问题。许多时间控件在桌面端表现良好但在移动设备上会出现弹窗错位、字体过小或交互不友好等问题。根据统计移动端用户占比已超过60%这种适配问题直接影响到大多数用户的使用体验。性能问题同样不容忽视。某些功能全面的时间控件体积超过100KB在网络条件较差的环境下会显著拖慢页面加载速度。对于追求极致性能的应用来说这种额外的性能开销是不可接受的。bootstrap-datetimepicker正是为解决这些问题而生。它采用模块化设计核心功能精炼同时提供丰富的配置选项让开发者能够以最小的代码量实现复杂的时间选择需求。[核心优势]: 轻量级架构如何实现高效开发bootstrap-datetimepicker的核心优势在于其精巧的设计理念完美平衡了功能丰富性和资源轻量化。这款插件的核心JavaScript文件仅18KBminified版本CSS文件不足5KB整体资源占用不到传统时间控件的1/5。这种轻量化设计不仅加快了页面加载速度还减少了带宽消耗特别适合移动端应用。插件的另一个显著优势是其灵活的日期时间格式化系统。通过简单的格式字符串开发者可以轻松实现各种日期时间表示方式。例如使用yyyy-MM-dd HH:mm:ss可以得到2023-10-05 14:30:45这样的标准格式而dd/MM/yyyy则会显示05/10/2023。这种灵活性使得同一个控件可以满足不同地区、不同场景的格式需求。多语言支持是bootstrap-datetimepicker的另一大亮点。项目内置了30多种语言的本地化文件涵盖了世界主要语言。开发者只需引入相应的语言文件并设置language参数即可实现界面的完全本地化。例如引入中文语言文件后日期选择器的月份、星期等文本都会自动转换为中文显示。响应式设计确保了插件在各种设备上的良好表现。无论是桌面显示器还是手机屏幕控件都能自动调整布局和大小提供一致的用户体验。这种响应式特性大大减少了开发者在不同设备上的适配工作。插件还提供了丰富的事件接口允许开发者在日期选择、控件显示/隐藏等关键时刻执行自定义逻辑。例如可以监听changeDate事件来实时验证用户选择的日期或者在show事件中动态调整控件位置。[功能矩阵]: 从基础到高级的全方位能力bootstrap-datetimepicker提供了一套完整的功能矩阵从基础的日期选择到高级的时间控制满足各种应用场景需求。让我们通过具体的适用场景、配置模板和效果对比来了解这些核心功能。基础日期选择适用场景用户注册表单中的出生日期选择、简单的日期筛选功能。配置模板$(#datepicker-basic).datetimepicker({ format: yyyy-mm-dd, // 日期格式 minView: 2, // 最小视图为月份视图 todayBtn: true, // 显示今天按钮 autoclose: true, // 选择日期后自动关闭 language: zh-CN // 使用中文显示 });效果对比未使用插件需要用户手动输入日期格式不统一易出错使用插件后直观的日历界面点击选择自动填充格式化日期减少输入错误时间精确控制适用场景会议预约系统、航班时刻表选择、精确到分钟的时间记录。配置模板$(#datetimepicker-precise).datetimepicker({ format: yyyy-mm-dd hh:ii, // 日期时间格式精确到分钟 minuteStep: 5, // 分钟选择间隔为5分钟 showMeridian: true, // 显示上午/下午 pickDate: true, // 允许选择日期 pickTime: true, // 允许选择时间 autoclose: true });效果对比传统解决方案日期和时间分开选择体验割裂使用插件后一体化的日期时间选择界面分钟按指定间隔显示提高选择效率日期范围限制适用场景酒店预订只能选择未来日期、活动报名截止日期设置。配置模板$(#datetimepicker-range).datetimepicker({ startDate: new Date(), // 开始日期为今天 endDate: 30d, // 结束日期为30天后 todayHighlight: true, // 高亮显示今天 daysOfWeekDisabled: [0, 6], // 禁用周末 autoclose: true });效果对比无限制选择需要额外代码验证日期有效性使用插件后自动禁用不可选日期直观显示可选范围减少用户无效操作多语言切换适用场景跨国应用、多语言网站。配置模板!-- 引入中文语言文件 -- script srcsrc/js/locales/bootstrap-datetimepicker.zh-CN.js/script script $(#datetimepicker-multilang).datetimepicker({ language: zh-CN, // 设置为中文 format: yyyy年mm月dd日 // 中文日期格式 }); // 动态切换语言示例 $(#switch-lang).click(function() { var currentLang $(#datetimepicker-multilang).data(datetimepicker).language; var newLang currentLang zh-CN ? en : zh-CN; $(#datetimepicker-multilang).datetimepicker(remove); $(#datetimepicker-multilang).datetimepicker({ language: newLang, format: newLang zh-CN ? yyyy年mm月dd日 : mm/dd/yyyy }); }); /script效果对比单一语言无法满足国际化需求使用插件后一键切换界面语言日期格式自动适配提升国际用户体验[实战方案]: 生产环境中的配置策略在实际生产环境中bootstrap-datetimepicker的配置需要根据具体业务场景进行优化。以下是三种常见场景的完整配置方案包含详细注释和最佳实践。方案一电商订单时间选择器业务需求用户选择配送日期和时间段只能选择未来7天内的日期每天分为3个配送时段禁止选择已过时段。div classform-group label fordelivery-time配送时间/label div classinput-group date iddelivery-time input typetext classform-control readonly span classinput-group-addon i classicon-calendar/i /span /div /div script $(function() { // 获取当前时间 var now new Date(); // 计算7天后的日期 var endDate new Date(); endDate.setDate(now.getDate() 7); $(#delivery-time).datetimepicker({ format: yyyy-mm-dd HH:ii, startDate: now, // 开始日期为当前时间 endDate: endDate, // 结束日期为7天后 minView: 1, // 最小视图为小时视图 hourStep: 4, // 小时选择间隔为4小时 minuteStep: 60, // 分钟固定为00 pickSeconds: false, // 不显示秒 autoclose: true, language: zh-CN, // 自定义小时选项只显示三个配送时段 hoursDisabled: [0,1,2,3,4,5,6,7,12,13,17,18,19,20,21,22,23], // 选择日期时间后的回调函数 onSelect: function(dateText) { // 显示选中的配送时间段 showDeliveryTimeSlot(dateText); } }); // 根据选择的时间显示配送时段信息 function showDeliveryTimeSlot(dateText) { var hour parseInt(dateText.split( )[1].split(:)[0]); var slotText ; if (hour 8 hour 12) { slotText 上午配送 (8:00-12:00); } else if (hour 12 hour 17) { slotText 下午配送 (12:00-17:00); } else if (hour 17 hour 20) { slotText 晚间配送 (17:00-20:00); } $(#delivery-slot-info).text(您选择的配送时段 slotText); } }); /script方案二酒店预订日期范围选择器业务需求选择入住和离店日期入住日期必须晚于今天离店日期必须晚于入住日期显示价格日历。div classrow div classcol-md-6 div classform-group label forcheckin-date入住日期/label div classinput-group date idcheckin-date input typetext classform-control readonly span classinput-group-addoni classicon-calendar/i/span /div /div /div div classcol-md-6 div classform-group label forcheckout-date离店日期/label div classinput-group date idcheckout-date input typetext classform-control readonly span classinput-group-addoni classicon-calendar/i/span /div /div /div /div div idprice-calendar classwell/div script $(function() { var checkinDate null; var checkoutDate null; // 入住日期选择器 $(#checkin-date).datetimepicker({ format: yyyy-mm-dd, startDate: new Date(), // 今天开始 minView: 2, // 月份视图 autoclose: true, language: zh-CN, todayHighlight: true }).on(changeDate, function(e) { checkinDate e.date; // 设置离店日期的开始时间为入住日期1天 var minCheckoutDate new Date(checkinDate); minCheckoutDate.setDate(minCheckoutDate.getDate() 1); $(#checkout-date).datetimepicker(setStartDate, minCheckoutDate); // 更新价格日历 updatePriceCalendar(); }); // 离店日期选择器 $(#checkout-date).datetimepicker({ format: yyyy-mm-dd, startDate: new Date(), // 默认为今天会在选择入住日期后更新 minView: 2, autoclose: true, language: zh-CN }).on(changeDate, function(e) { checkoutDate e.date; // 更新价格日历 updatePriceCalendar(); }); // 更新价格日历显示 function updatePriceCalendar() { if (!checkinDate || !checkoutDate) return; // 计算入住天数 var days Math.ceil((checkoutDate - checkinDate) / (1000 * 60 * 60 * 24)); // 模拟价格数据 var pricePerNight 499; var totalPrice days * pricePerNight; // 显示价格信息 var html h4价格信息/h4; html p入住日期: formatDate(checkinDate) /p; html p离店日期: formatDate(checkoutDate) /p; html p共 days 晚/p; html p每晚价格: ¥ pricePerNight /p; html pstrong总价: ¥ totalPrice /strong/p; $(#price-calendar).html(html); } // 辅助函数格式化日期 function formatDate(date) { return date.getFullYear() - padZero(date.getMonth() 1) - padZero(date.getDate()); } // 辅助函数补零 function padZero(num) { return num 10 ? 0 num : num; } }); /script方案三工作日时间选择器业务需求企业应用中的会议预约只能选择工作日周一至周五的工作时间9:00-18:00且预约时长为30分钟的倍数。div classform-group label formeeting-time会议时间/label div classinput-group date idmeeting-time input typetext classform-control readonly span classinput-group-addoni classicon-time/i/span /div /div script $(function() { $(#meeting-time).datetimepicker({ format: yyyy-mm-dd hh:ii, startDate: new Date(), // 从今天开始 minView: 0, // 显示到分钟视图 minuteStep: 30, // 30分钟为间隔 autoclose: true, language: zh-CN, // 禁用周末 daysOfWeekDisabled: [0, 6], // 自定义小时禁用规则 hoursDisabled: function(date) { var hour date.getHours(); // 只允许9:00-18:00 return hour 9 || hour 18; }, // 选择时间后的验证 onSelect: function(dateText) { validateMeetingTime(dateText); } }); // 验证会议时间是否符合规则 function validateMeetingTime(dateText) { var selectedDate new Date(dateText); var dayOfWeek selectedDate.getDay(); var hour selectedDate.getHours(); // 再次验证是否为工作日和工作时间客户端安全验证 if (dayOfWeek 0 || dayOfWeek 6) { alert(只能选择工作日进行会议预约); $(#meeting-time).val(); return false; } if (hour 9 || hour 18) { alert(只能选择9:00-18:00之间的时间); $(#meeting-time).val(); return false; } return true; } }); /script[进阶技巧]: 解锁插件的隐藏潜力bootstrap-datetimepicker提供了许多高级功能和API掌握这些技巧可以帮助你应对更复杂的业务场景提升开发效率。自定义日期验证规则除了内置的日期范围限制你还可以通过beforeShowDay选项实现复杂的日期验证逻辑。例如在医院预约系统中需要排除医生的休息日和已约满的日期$(#appointment-date).datetimepicker({ format: yyyy-mm-dd, minView: 2, autoclose: true, language: zh-CN, // 自定义日期显示规则 beforeShowDay: function(date) { // 1. 排除周末 var day date.getDay(); if (day 0 || day 6) { return {enabled: false, classes: weekend, tooltip: 周末不提供预约}; } // 2. 排除特定节假日 var holidays [ 2023-10-01, // 国庆节 2023-12-25, // 圣诞节 2024-01-01 // 元旦 ]; var dateStr formatDate(date); if (holidays.indexOf(dateStr) ! -1) { return {enabled: false, classes: holiday, tooltip: 节假日不提供预约}; } // 3. 模拟已约满的日期 var fullyBooked [2023-10-10, 2023-10-15]; if (fullyBooked.indexOf(dateStr) ! -1) { return {enabled: false, classes: fully-booked, tooltip: 该日期已约满}; } // 4. 对可预约日期添加特殊样式 return {enabled: true, classes: available, tooltip: 可预约}; } }); // 添加自定义CSS样式 style .datepicker-days .weekend { background-color: #f2dede; } .datepicker-days .holiday { background-color: #d9edf7; } .datepicker-days .fully-booked { background-color: #fcf8e3; } .datepicker-days .available { background-color: #dff0d8; } /style事件监听与数据交互bootstrap-datetimepicker提供了丰富的事件接口可以实时响应用户操作并与其他组件进行数据交互。以下是一个实时计算年龄的示例div classform-group label forbirth-date出生日期/label div classinput-group date idbirth-date input typetext classform-control readonly span classinput-group-addoni classicon-calendar/i/span /div /div div classform-group label年龄/label p idage-calculation classform-control-static请选择出生日期/p /div script $(function() { $(#birth-date).datetimepicker({ format: yyyy-mm-dd, endDate: new Date(), // 只能选择今天及以前的日期 minView: 2, autoclose: true, language: zh-CN }).on(changeDate, function(e) { // 当日期改变时计算年龄 calculateAge(e.date); }); // 计算年龄的函数 function calculateAge(birthDate) { var today new Date(); var age today.getFullYear() - birthDate.getFullYear(); var monthDiff today.getMonth() - birthDate.getMonth(); // 如果生日还没过年龄减1 if (monthDiff 0 || (monthDiff 0 today.getDate() birthDate.getDate())) { age--; } // 显示年龄 $(#age-calculation).text(age 岁); // 根据年龄显示不同的内容 if (age 18) { $(#age-warning).show().text(注意未成年人需要监护人陪同); } else if (age 60) { $(#age-warning).show().text(注意60岁以上老人可优先办理); } else { $(#age-warning).hide(); } } }); /script动态修改配置在某些场景下你可能需要根据用户操作动态修改日期选择器的配置。例如当用户选择紧急订单时将配送日期限制为3天内div classform-group label classcheckbox-inline input typecheckbox idurgent-order 紧急订单 /label /div div classform-group label fordelivery-date配送日期/label div classinput-group date iddelivery-date input typetext classform-control readonly span classinput-group-addoni classicon-calendar/i/span /div /div script $(function() { // 初始化日期选择器默认15天内可选择 var defaultEndDate new Date(); defaultEndDate.setDate(defaultEndDate.getDate() 15); $(#delivery-date).datetimepicker({ format: yyyy-mm-dd, startDate: new Date(), endDate: defaultEndDate, minView: 2, autoclose: true, language: zh-CN }); // 监听紧急订单复选框 $(#urgent-order).change(function() { var $picker $(#delivery-date).data(datetimepicker); if (this.checked) { // 紧急订单限制3天内配送 var urgentEndDate new Date(); urgentEndDate.setDate(urgentEndDate.getDate() 3); $picker.setEndDate(urgentEndDate); $(#delivery-date).next(.help-block).text(紧急订单需在3天内配送); } else { // 恢复默认设置 $picker.setEndDate(defaultEndDate); $(#delivery-date).next(.help-block).text(普通订单15天内配送); } }); }); /script[常见问题诊断]: 解决开发中的痛点难点在使用bootstrap-datetimepicker的过程中开发者可能会遇到各种问题。以下是一些常见问题的诊断方法和解决方案。问题一控件显示位置异常症状日期选择器弹窗位置偏移不在输入框下方显示。可能原因父元素使用了position: relative或overflow: hidden页面滚动后未重新计算位置Bootstrap CSS版本冲突解决方案// 1. 初始化时指定容器 $(#datetimepicker).datetimepicker({ container: body // 将弹窗附加到body避免父元素样式影响 }); // 2. 监听窗口滚动事件重新定位 $(window).scroll(function() { var $picker $(#datetimepicker).data(datetimepicker); if ($picker $picker.widget.is(:visible)) { $picker.place(); // 重新计算位置 } }); // 3. 检查Bootstrap版本确保与插件兼容 // bootstrap-datetimepicker支持Bootstrap 2.3.2和3.x版本问题二日期格式转换错误症状选择日期后获取的日期对象与预期不符或格式转换失败。可能原因格式字符串设置错误未正确处理时区问题日期解析逻辑错误解决方案// 1. 使用正确的格式字符串 // 正确: yyyy-mm-dd HH:ii:ss // 错误: YYYY-MM-DD hh:mm:ss (注意大小写) // 2. 处理时区问题 var picker $(#datetimepicker).datetimepicker({ format: yyyy-mm-dd HH:ii:ss }); // 获取UTC日期对象 var utcDate picker.data(datetimepicker).getDate(); // 转换为本地日期 var localDate new Date(utcDate.getTime() utcDate.getTimezoneOffset() * 60000); // 3. 使用内置的日期格式化方法 var formattedDate picker.data(datetimepicker).formatDate(utcDate);问题三多语言配置不生效症状设置language参数后界面仍显示英文。可能原因未引入对应语言的本地化文件语言文件路径错误语言代码不正确解决方案!-- 正确引入中文语言文件 -- script srcsrc/js/locales/bootstrap-datetimepicker.zh-CN.js/script script // 确认语言代码正确 $(#datetimepicker).datetimepicker({ language: zh-CN, // 注意是zh-CN而不是zh或cn format: yyyy-mm-dd }); // 检查语言文件是否加载成功 if (typeof $.fn.datetimepicker.dates[zh-CN] undefined) { console.error(中文语言文件加载失败); } /script问题四移动端兼容性问题症状在移动设备上日期选择器显示异常或无法正常操作。可能原因未引入Bootstrap响应式CSS移动设备触摸事件处理不当视图端口设置不正确解决方案!-- 添加视口设置 -- meta nameviewport contentwidthdevice-width, initial-scale1.0 !-- 确保引入Bootstrap响应式CSS -- link relstylesheet hrefbootstrap/css/bootstrap-responsive.min.css script // 针对移动设备优化配置 var isMobile /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); $(#datetimepicker).datetimepicker({ format: yyyy-mm-dd, minView: isMobile ? 2 : 0, // 移动端默认显示月份视图 maxView: 4, autoclose: true, // 移动设备上增大字体 fontSize: isMobile ? 16px : inherit }); /script[性能优化建议]: 让控件更轻更快虽然bootstrap-datetimepicker已经非常轻量但在高性能要求的应用中仍有优化空间。以下是一些实用的性能优化建议。延迟加载与按需初始化对于包含多个时间选择器的页面可以采用延迟加载策略只在用户需要时才初始化控件// 延迟初始化示例 $(function() { // 为所有日期选择器添加点击事件委托 $(document).on(focus, .datetimepicker-input, function() { var $this $(this); // 避免重复初始化 if (!$this.data(datetimepicker)) { $this.datetimepicker({ format: yyyy-mm-dd, autoclose: true, language: zh-CN }); // 触发显示 $this.datetimepicker(show); } }); });减少DOM操作频繁的DOM操作会导致页面重排影响性能。可以通过以下方式减少DOM操作// 优化前多次DOM操作 for (var i 0; i 12; i) { $(.months-container).append(span classmonth months[i] /span); } // 优化后一次性DOM操作 var monthsHtml ; for (var i 0; i 12; i) { monthsHtml span classmonth months[i] /span; } $(.months-container).html(monthsHtml);使用事件委托对于动态生成的日期选择器使用事件委托可以提高事件处理效率// 不推荐为每个选择器单独绑定事件 $(.datetimepicker).each(function() { $(this).datetimepicker().on(changeDate, function(e) { // 处理日期变化 }); }); // 推荐使用事件委托 $(document).on(changeDate, .datetimepicker, function(e) { // 处理日期变化 });缓存DOM元素避免在事件处理函数中频繁查询DOM// 优化前每次事件触发都查询DOM $(#datetimepicker).on(changeDate, function(e) { $(#log-container).append(divDate changed: e.date /div); }); // 优化后缓存DOM元素 var $logContainer $(#log-container); $(#datetimepicker).on(changeDate, function(e) { $logContainer.append(divDate changed: e.date /div); });[资源获取与生态扩展]: 丰富插件功能bootstrap-datetimepicker拥有活跃的社区支持和丰富的扩展资源可以帮助你进一步扩展其功能。官方资源源码获取通过Git克隆仓库获取最新代码git clone https://gitcode.com/gh_mirrors/boo/bootstrap-datetimepicker核心文件主脚本src/js/bootstrap-datetimepicker.js样式文件src/less/bootstrap-datetimepicker.less语言文件src/js/locales/目录下的各语言文件构建工具项目根目录下的Makefile提供了构建命令可以生成压缩版的CSS和JS文件make # 构建所有资源 make js # 仅构建JavaScript文件 make css # 仅构建CSS文件第三方扩展日期范围选择插件结合两个datetimepicker实现日期范围选择支持开始日期和结束日期联动。时间线选择器扩展插件提供可视化的时间线选择界面适合预约时间段选择。颜色主题包社区贡献的多种颜色主题可快速适配不同网站风格。日期计算工具提供日期加减、工作日计算等实用功能的扩展库。学习资源API文档项目仓库中的README.md提供了详细的API说明和配置选项。示例代码test/目录下包含多种使用场景的示例代码可以作为开发参考。社区支持通过项目的issue系统可以提问和报告bug社区响应通常很及时。教程文章网络上有大量关于bootstrap-datetimepicker的教程和使用技巧可以帮助开发者快速掌握高级用法。[版本迁移指南]: 平滑升级到新版本随着bootstrap-datetimepicker的不断更新新版本可能引入不兼容的变更。以下是从旧版本升级到最新版的指南。从v3.x升级到v4.x依赖变更v4.x不再支持Bootstrap 2.x需要升级到Bootstrap 3.x或4.xjQuery版本要求提升到1.8.3以上配置选项变更format选项的格式标记有所调整例如yyyy代替yyyy保持不变mm表示两位数月份language选项现在需要完整的语言代码如zh-CN而非zhstartDate和endDate现在接受Date对象或字符串事件名称变更changeDate事件重命名为dp.changeshow事件重命名为dp.showhide事件重命名为dp.hide方法调用方式变更// v3.x $(#datetimepicker).datetimepicker(update, new Date()); // v4.x $(#datetimepicker).data(DateTimePicker).date(new Date());从v4.x升级到v5.x主要变更完全重写了核心代码采用更现代的JavaScript语法移除了对jQuery的依赖现在是原生JavaScript插件支持ES6模块导入初始化方式变更// v4.x (jQuery) $(#datetimepicker).datetimepicker(options); // v5.x (原生JS) var picker new DateTimePicker(#datetimepicker, options);配置选项调整format选项现在使用dateFormat和timeFormat分别设置日期和时间格式minView重命名为viewModeautoclose重命名为autoClose事件处理变更// v4.x $(#datetimepicker).on(dp.change, function(e) { ... }); // v5.x picker.on(change, function(e) { ... });升级建议先在测试环境中进行升级不要直接在生产环境操作使用浏览器控制台查看是否有错误信息逐步替换弃用的API而不是一次性修改所有代码查阅官方的升级文档了解详细的变更列表通过本文的介绍我们全面了解了bootstrap-datetimepicker这款轻量级时间选择插件的核心功能、实战配置和进阶技巧。从基础的日期选择到复杂的时间范围限制从多语言支持到性能优化这款插件提供了一套完整的解决方案帮助开发者快速实现专业的时间选择界面。无论是简单的表单还是复杂的预订系统bootstrap-datetimepicker都能以其轻量化的设计和丰富的功能满足需求显著提升开发效率和用户体验。【免费下载链接】bootstrap-datetimepicker项目地址: https://gitcode.com/gh_mirrors/boo/bootstrap-datetimepicker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考