【发布时间】:2021-06-14 11:17:08
【问题描述】:
我想让我的 DateTime 始终保存为以下格式:yMMMd
即2021 年 3 月 30 日
问题:
当我格式化我的 DateTime 时,它会格式化为字符串。当我尝试将其解析回 DateTime 时,我得到错误并且没有成功。
我在寻找一个好的解决方案时遇到了问题。
这是可能的还是我必须接受保存为字符串?
编辑
尝试了所有推荐的方法,我尝试了许多其他方法也没有奏效。我想知道 Intl 包日期格式是否难以解析回 DateTime?那可能是我的问题。有人吗?
请看看我的打印语句和错误,看看什么是成功的,什么不是。
我正在尝试这个的日期选择器:
Future<void> _selectDate(BuildContext context) async {
final DateTime picked = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2015, 8),
lastDate: DateTime(2101));
if (picked != null)
setState(() {
print('------ Picked date: $picked');
var dateString = '';
final formattedDate = DateFormat.yMMMd().format(picked);
var parsedDate = DateTime.parse(formattedDate); // Does not work...
print('------- Parsed date: $parsedDate');
dateString = formattedDate;
print('------ String date: $dateString');
expenseDate = formattedDate as DateTime;
print('------ Formatted date: ${formattedDate.toString()}');
});
}
错误:
flutter: ------ Picked date: 2021-03-31 00:00:00.000
[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: FormatException: Invalid date format
Mar 31, 2021
#0 DateTime.parse (dart:core/date_time.dart:322:7)
#1 _AddExpenseButtonState._selectDate.<anonymous closure> (package:fp_provider_demo_one/widgets/add_expense_button.dart:48:35)
#2 State.setState (package:flutter/src/widgets/framework.dart:1267:30)
#3 _AddExpenseButtonState._selectDate (package:fp_provider_demo_one/widgets/add_expense_button.dart:44:7)
<asynchronous suspension>
【问题讨论】:
-
您根本没有尝试解析
DateTime字符串;相反,您尝试强制转换它(即,假装String是DateTime对象,但事实并非如此)。如果您想实际解析它,请参阅convert datetime string to datetime object in dart? -
今晚我会检查一下,出于某种原因,我相信我在执行此操作时也遇到了问题——因此这篇文章看似多余。我将编辑我的帖子以更详细地说明我不能做什么
-
尝试解析,不行。尝试将 intl 格式的字符串解析为 DateTime 可能是一个问题吗?
-
正如我在对链接问题的回答中提到的,
DateTime.parse仅处理一小组日期/时间格式。由于您使用DateFormat将DateTime格式化为字符串,因此您也应该使用DateFormat将其解析回:DateFormat.yMMMd().parse(formattedDate)。 -
DateTime根据定义存储日期和时间。您可以随意忽略时间部分,但无论何时要将其转换为String(或返回),都需要使用DateFormat。您可以创建自己的Date类,该类在内部存储DateTime并且其toString()方法使用DateFormat。
标签: flutter dart datetime-format