Flutter中DayView日期本地化(de_DE)格式化失败求助
需求:希望DayView的日期显示为dd.MM.yyyy格式,但当前始终显示为yyyy-MM-dd。
最初通过以下代码成功将日期格式化为dd.MM.yyyy字符串:
String datumDesTages = DateFormat.yMd('de_DE').format(DateTime.now());
但由于DayView需要DateTime类型,尝试解析该字符串时抛出FormatException:
DateTime datumDesTagesDateTime = Intl.withLocale('de', () => DateFormat().parse(datumDesTages));
错误信息:
The following FormatException was thrown building EventSet(dirty, state: _EventSetState#95b2d):
Trying to read . from 12.2.2023 at position 4
完整代码:
class _EventSetState extends State<EventSet> { @override Widget build(BuildContext context) { String datumDesTages = DateFormat.yMd('de_DE').format(DateTime.now()); //String datumDesTagesString = datumDesTages.format(DateTime.now()); DateTime datumDesTagesDateTime = Intl.withLocale('de', () => DateFormat().parse(datumDesTages)); //DateFormat('d.M.y').parse(datumDesTagesString)); return Scaffold( appBar: AppBar( title: Text('Termin setzen'), ), body: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Expanded( child: Container( child: DayView( date: datumDesTagesDateTime, style: DayViewStyle.fromDate( date: datumDesTagesDateTime, headerSize: 20, ), ), ), ), // EventDetailScreen(), ], ), ), floatingActionButton: FloatingActionButton( child: Icon( Icons.add, color: Colors.blue, ), backgroundColor: Colors.red[50], onPressed: () { Navigator.of(context).pushNamed(EventDetailScreen.routeName); }, ), ); } }
问题原因与解决方法
核心问题
你做了无意义的冗余操作:先把DateTime格式化成字符串,再把字符串解析回DateTime。而且解析时,DateFormat()默认使用的格式和你生成的dd.MM.yyyy不匹配,直接导致格式异常。
另外要明确:DateTime只是时间数据载体,DayView的日期显示格式,由自身的本地化配置控制,和传入的DateTime对象本身无关。
正确解决步骤
直接使用原始
DateTime对象
删掉格式化再解析的多余代码,直接传递DateTime实例给DayView:DateTime datumDesTagesDateTime = DateTime.now();配置DayView的本地化显示
要让DayView显示dd.MM.yyyy格式,需配置其本地化规则:- 确保项目已添加
intl依赖,并导入de_DE本地化资源 - 若DayView支持自定义日期格式,可在样式中指定:
DayView( date: datumDesTagesDateTime, style: DayViewStyle.fromDate( date: datumDesTagesDateTime, headerSize: 20, dateFormat: DateFormat('dd.MM.yyyy', 'de_DE'), ), )
若DayView遵循全局本地化,只需确保App已配置
de_DE为当前Locale即可。- 确保项目已添加
若必须解析字符串(如外部传入)
解析时必须使用和生成字符串时一致的格式,不能用默认DateFormat():// 和生成时用相同的DateFormat实例解析 DateTime datumDesTagesDateTime = DateFormat.yMd('de_DE').parse(datumDesTages); // 或直接指定对应格式 DateTime datumDesTagesDateTime = DateFormat('dd.MM.yyyy', 'de_DE').parse(datumDesTages);
内容的提问来源于stack exchange,提问作者Pauer Auer

