【问题标题】:How do we format custom DateTime as DateTime in Flutter/Dart?我们如何在 Flutter/Dart 中将自定义 DateTime 格式化为 DateTime?
【发布时间】: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

标签: flutter dart datetime-format


【解决方案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 方法。这似乎很奇怪。我想我应该包括我是我的原始帖子。当我再看一遍时,我会更新它。
    • 解析失败,请查看编辑。谢谢。
    猜你喜欢
    • 2021-08-10
    • 2020-11-18
    • 2021-03-08
    • 1970-01-01
    • 2021-05-26
    • 2010-12-21
    • 1970-01-01
    • 2015-12-14
    • 2019-04-11
    相关资源
    最近更新 更多