Flutter默认DatePicker组件如何去除时间戳仅获取日期?
现有代码核心问题
- 逻辑引用错误:日期选择完成后,未使用弹窗返回的用户选中值
picked,反而将初始化弹窗用的DateTime.now()赋值给输入框,拿到的永远是打开弹窗当天的时间,不是用户选择的结果 - 格式不符合需求:
DateTime默认的toIso8601String()会携带完整的时分秒信息,无法输出纯日期格式 - 缺少空值判断:
showDatePicker在用户点击取消按钮时会返回null,未做空值判断会触发空指针报错
修正方案
- 引入空值判断,仅在用户确认选择日期(非取消)时执行赋值逻辑
- 基于用户选中的返回值,提取年、月、日字段生成全新的无时间信息的纯日期对象
- 对提取的月、日做两位补零处理,保证输出格式统一
修正后可直接运行的代码
TextEditingController dateCtl = TextEditingController(); CustomFromField( heading: getTranslated(context, "date_sample"), controller: dateCtl, onTap: () async { final DateTime initialDate = DateTime.now(); FocusScope.of(context).requestFocus(FocusNode()); // showDatePicker 返回值可空:用户取消选择时会返回null final DateTime? pickedDate = await showDatePicker( context: context, initialDate: initialDate, firstDate: DateTime(1900), lastDate: DateTime(2100), ); // 仅在用户选中日期时执行赋值 if (pickedDate != null) { // 生成无时间部分的纯日期对象 final pureDate = DateTime(pickedDate.year, pickedDate.month, pickedDate.day); // 格式化为 YYYY-MM-DD 纯字符串,自动补零 final formattedDate = [ pureDate.year.toString(), pureDate.month.toString().padLeft(2, '0'), pureDate.day.toString().padLeft(2, '0') ].join('-'); dateCtl.text = formattedDate; } }, ),
补充说明
- 如果需要保留带0值时间的ISO格式,可直接使用
pureDate.toIso8601String(),输出结果类似2024-05-20T00:00:00.000 - 不需要引入第三方日期格式化依赖,仅用Dart内置的DateTime能力即可实现纯日期输出
内容的提问来源于stack exchange,提问作者Rishail Siddiqui
相关产品推荐
相关产品推荐

