在Flutter中如何格式化DateTime

266
我试图在点击按钮后在一个文本部件中显示当前的DateTime。以下代码可以工作,但我想更改日期格式。 当前方法:
DateTime now = DateTime.now();
currentTime = new DateTime(now.year, now.month, now.day, now.hour, now.minute);
 Text('$currentTime'), 

结果

YYYY-MM-JJ HH-MM

问题

如何去除:00.000部分?

16个回答

501
你可以使用intl包中的DateFormat
import 'package:intl/intl.dart';

DateTime now = DateTime.now();
String formattedDate = DateFormat('yyyy-MM-dd – kk:mm').format(now);

76
别忘了在你的 pubspec.yaml 文件中添加 intl: 0.15.7 依赖项。该库的最新版本可以在这里找到。 - Defuera
1
还有其他人遇到静态成员无法在初始化器中访问的问题吗? - MrPool
1
@MrPool 是的,在初始化程序中无法访问静态成员也是同样的问题。这非常令人沮丧,因为将日期设置为静态毫无意义。 - Michael Tolsma
3
如果你想使用特定的语言环境,可以使用例如:DateFormat.yMd(myLocale.languageCode).format(now),其中你可以像这样获取当前设备语言环境:Locale myLocale = Localizations.localeOf(context)。请注意,本文只提供翻译,不包括解释或其他内容。 - Zsolt

96

intl package添加到您的pubspec.yaml文件中。

import 'package:intl/intl.dart';

DateFormat dateFormat = DateFormat("yyyy-MM-dd HH:mm:ss");

将DateTime对象转换为字符串

String string = dateFormat.format(DateTime.now());

将字符串转换为DateTime对象

DateTime dateTime = dateFormat.parse("2019-07-19 8:40:23");

86

使用这种方法,无需导入任何库。

DateTime now = DateTime.now();

String convertedDateTime = "${now.year.toString()}-${now.month.toString().padLeft(2,'0')}-${now.day.toString().padLeft(2,'0')} ${now.hour.toString().padLeft(2,'0')}-${now.minute.toString().padLeft(2,'0')}";

输出

2020-12-05 14:57


7
除了缺少破折号外,这是最好的方法,而不需要添加另一个依赖。 - 01000101
1
这很好,但是小时以24小时制返回非美国标准时间。算术...唉...算了吧,我只需获取该软件包。 - Amir Memon
外部依赖有什么问题吗?这就是2020年的工作方式 :-) - funder7
2
@funder7 - 每个外部依赖都是您代码库中潜在的故障点。依赖关系由第三方维护 - 因此,您无法保证每个迭代(即版本更改)中这些第三方代码的功能和稳定性。因此,在您的生产代码中尽可能少地使用依赖项是明智的选择。 - SilSur
1
是的,这可能是真的,但如果你担心回归,你可以坚持使用固定版本。开发外部库的用户通常提供良好的代码:考虑上面的片段:它以预期的格式返回日期,但在我看来,这很丑陋,考虑到Flutter有intl库,它非常好地处理了日期/时间国际化。这是经过测试的代码,可能比你通过剪切和粘贴得到的要好得多。显然,我不会为字符串连接导入外部库...但我想你明白我的意思。干杯;) - funder7
2
这很理想,而且没有添加任何包。唯一的问题是我认为您还需要在分钟字段中添加 padLeft(2,'0'),否则 14:07 将显示为 14:7。 - its_broke_again

32

这是我的简单解决方案。它不需要任何依赖。

但是,日期将会以字符串格式呈现。如果您想要时间,请更改子字符串的值。

print(new DateTime.now()
            .toString()
            .substring(0,10)
     );   // 2020-06-10

这个代码可以很好地运行,而且不需要任何包。以下是实现它的方法。DateTime now = DateTime.now();DateTime date = new DateTime(now.year, now.month, now.day); print(date.toString().substring(0, 10)); - Raju Gupta

27

试试这个包,Jiffy,它也运行在Intl之上,但使用momentjs语法更方便。详见下文。

import 'package:jiffy/jiffy.dart';   

var now = Jiffy().format("yyyy-MM-dd HH:mm:ss");

你也可以做以下事情

var a = Jiffy().yMMMMd; // October 18, 2019

您还可以传入DateTime对象、字符串和数组。

var a = Jiffy(DateTime(2019, 10, 18)).yMMMMd; // October 18, 2019

var a = Jiffy("2019-10-18").yMMMMd; // October 18, 2019

var a = Jiffy([2019, 10, 18]).yMMMMd; // October 18, 2019

14

使用这个函数

todayDate() {
    var now = new DateTime.now();
    var formatter = new DateFormat('dd-MM-yyyy');
    String formattedTime = DateFormat('kk:mm:a').format(now);
    String formattedDate = formatter.format(now);
    print(formattedTime);
    print(formattedDate);
  }

输出:

08:41:AM
21-12-2019

10

自0.16版本以来有一些变化,以下是我所做的方式:

在pubspec.yaml中导入

dependencies:
      flutter:
        sdk: flutter
      intl: ^0.16.1

然后使用

  txdate= DateTime.now()


  DateFormat.yMMMd().format(txdate)

9

你可以使用DateTime.now()clock.now()。 以下是使用clock库的示例:

import 'package:clock/clock.dart';

DateTime now = clock.now();
String formattedDate = DateFormat('yyyy-MM-dd – kk:mm').format(now);

5
DateTime.now() 没有被弃用。 https://api.flutter.dev/flutter/dart-core/DateTime-class.html - jaredbaszler

7
您也可以使用以下格式:YYYY-MM-DD HH-MM:
var now = DateTime.now();
var month = now.month.toString().padLeft(2, '0');
var day = now.day.toString().padLeft(2, '0');
var text = '${now.year}-$month-$day ${now.hour}:${now.minute}';

这并没有为真实的“yyyy-MM-dd”添加正确的填充。 - 01000101

6

如果用户是美国公民但希望以24小时格式查看所有内容,则显示基于区域设置的12/24小时格式将无法满足用户。

 // getting system settings 12/24 h format
      if (MediaQuery.of(context).alwaysUse24HourFormat){
        timeFormat = new DateFormat("kk:mm", languageCode); //24h format
      }
      else{
        timeFormat = new DateFormat("KK:mm a", languageCode); //12h format
      }
//then use it:
 '${timeFormat.format DateTime.now())}'

请注意,如果您想以12小时制而不是24小时制查看12:00(24小时制),则使用“hh”和“HH”而不是“kk”和“KK”h表示上午/下午的小时数(112)(数字) H表示一天中的小时数(023)(数字) k表示一天中的小时数(124)(数字) K表示上午/下午的小时数(011)(数字) - Nazarii Boichyshyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接