我们如何在 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 字符串;相反,您尝试强制转换它(即,假装 StringDateTime 对象,但事实并非如此)。如果您想实际解析它,请参阅convert datetime string to datetime object in dart? 今晚我会检查一下,出于某种原因,我相信我在执行此操作时也遇到了问题——因此这篇文章看似多余。我将编辑我的帖子以更详细地说明我不能做什么 尝试解析,不行。尝试将 intl 格式的字符串解析为 DateTime 可能是一个问题吗? 正如我在对链接问题的回答中提到的,DateTime.parse 仅处理一小组日期/时间格式。由于您使用DateFormatDateTime 格式化为字符串,因此您也应该使用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 [重复]

Flutter:自定义单选按钮

Flutter / Dart / Firebase - 流返回空列表

Flutter - 自定义警报对话框未显示