我们如何在 Flutter/Dart 中将自定义 DateTime 格式化为 DateTime?
Posted
技术标签:
【中文标题】我们如何在 Flutter/Dart 中将自定义 DateTime 格式化为 DateTime?【英文标题】:How do we format custom DateTime as DateTime in Flutter/Dart? 【发布时间】: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
。
【参考方案1】:
所以你想格式化你的日期时间,然后想把它解析回一个 DateTime 实例
试试Jiffy 包,可能会有所帮助。见下文
从您的时间选择器中选择的时间示例
DateTime picked = DateTime(2021, 3, 21); // just a random datetime
格式化试试下面
final formattedDate = Jiffy(picked).yMMMd; // Mar 21, 2021
将其解析回 DateTime
var parsedDate = Jiffy(formattedDate, "MMM dd, yyyy").dateTime; // 2021-03-21 00:00:00.000
Jiffy 运行在 Intl 之上,你也可以用它做很多很酷的事情,试试看
【讨论】:
【参考方案2】:使用parse
方法从字符串中取回DateTime
。
final df = DateFormat.yMMMd();
final dateString = df.format(picked);
final expenseDate = df.parse(dateString);
https://pub.dev/documentation/intl/latest/intl/DateFormat/parse.html
【讨论】:
今晚我会试试这个,我认为由于某种奇怪的原因我无法访问 .parse 方法。这似乎很奇怪。我想我应该包括我是我的原始帖子。当我再看一遍时,我会更新它。 解析失败,请查看编辑。谢谢。以上是关于我们如何在 Flutter/Dart 中将自定义 DateTime 格式化为 DateTime?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter/Dart 中将 Future<double> 转换为 double?
Flutter/Dart 为 Google Maps Marker 添加自定义点击事件
在 Flutter(Dart)中将字符串解析为 DateTime [重复]