如何使用Dart格式化日期?

361

我有一个 DateTime 实例,我想将其格式化为字符串。我该怎么做?我想将日期转换为类似于"2013-04-20"的字符串。

24个回答

746
你可以使用intl包(安装程序)来格式化日期。对于en_US格式,它非常简单:
import 'package:intl/intl.dart';

main() {
  final DateTime now = DateTime.now();
  final DateFormat formatter = DateFormat('yyyy-MM-dd');
  final String formatted = formatter.format(now);
  print(formatted); // something like 2013-04-20
}

有许多格式选项。参考文档:

ICU Name                   Skeleton
--------                   --------
DAY                          d
ABBR_WEEKDAY                 E
WEEKDAY                      EEEE
ABBR_STANDALONE_MONTH        LLL
STANDALONE_MONTH             LLLL
NUM_MONTH                    M
NUM_MONTH_DAY                Md
NUM_MONTH_WEEKDAY_DAY        MEd
ABBR_MONTH                   MMM
ABBR_MONTH_DAY               MMMd
ABBR_MONTH_WEEKDAY_DAY       MMMEd
MONTH                        MMMM
MONTH_DAY                    MMMMd
MONTH_WEEKDAY_DAY            MMMMEEEEd
ABBR_QUARTER                 QQQ
QUARTER                      QQQQ
YEAR                         y
YEAR_NUM_MONTH               yM
YEAR_NUM_MONTH_DAY           yMd
YEAR_NUM_MONTH_WEEKDAY_DAY   yMEd
YEAR_ABBR_MONTH              yMMM
YEAR_ABBR_MONTH_DAY          yMMMd
YEAR_ABBR_MONTH_WEEKDAY_DAY  yMMMEd
YEAR_MONTH                   yMMMM
YEAR_MONTH_DAY               yMMMMd
YEAR_MONTH_WEEKDAY_DAY       yMMMMEEEEd
YEAR_ABBR_QUARTER            yQQQ
YEAR_QUARTER                 yQQQQ
HOUR24                       H
HOUR24_MINUTE                Hm
HOUR24_MINUTE_SECOND         Hms
HOUR                         j
HOUR_MINUTE                  jm
HOUR_MINUTE_SECOND           jms
HOUR_MINUTE_GENERIC_TZ       jmv
HOUR_MINUTE_TZ               jmz
HOUR_GENERIC_TZ              jv
HOUR_TZ                      jz
MINUTE                       m
MINUTE_SECOND                ms
SECOND                       s
对于非en_US日期,您需要明确加载区域设置。有关更多信息,请参阅DateFormat文档。如果您想要更深入地了解每个国家/语言的格式,则date_symbol_data_local.dart包含所有格式。

intl 出了问题吗?Uncaught Error: FileSystemException: 无法打开文件,路径为 'E:\dart\ws\web\packages\intl\intl.dart'(操作系统错误:系统找不到指定的路径。) - javapadawan
3
有没有办法在格式中添加毫秒? - Kaspi
3
需要在pubspec.yaml文件中声明以下依赖: dependencies: intl: ^0.15.7 - murt
1
@Kaspi 尝试使用 'S' 来表示小数秒。 - madlick71
1
ICU格式名称也可以在此处找到(https://unicode-org.github.io/icu/userguide/format_parse/datetime/#datetime-format-syntax),并附有更多示例。 - rupinderjeet
显示剩余8条评论

69

这也可以工作:

DateTime today = new DateTime.now();
String dateSlug ="${today.year.toString()}-${today.month.toString().padLeft(2,'0')}-${today.day.toString().padLeft(2,'0')}";
print(dateSlug);

7
这不是一个明智的做法,因为它没有根据用户所在地区进行本地化。 - DustinB
@DustinB 你确定吗?在我的情况下它似乎是本地化的,但如果不是,那就转换一下。DateTime.toLocal() 应该可以解决问题。 - EzPizza
1
它正在使用YEAR-MM-DD的字符串拼接格式。这可能与您当前的语言环境匹配,但肯定不是所有人都适用的。例如,在美国,更有可能使用MM/DD/YYYY。 - DustinB
1
@EzPizza toLocal() 是时区转换而不是国际转换。 - Ralph Shillington
1
@RalphShillington 哎呀,我本来以为问题是关于时区的。是的,这个解决方案只适用于特定的语言环境。 - EzPizza

50

pubspec.yaml:

dependencies:
  intl:

main.dart:

import 'package:intl/intl.dart'; // for date format
import 'package:intl/date_symbol_data_local.dart'; // for other locales

void main() {
  var now = DateTime.now();
  print(DateFormat().format(now)); // This will return date using the default locale
  print(DateFormat('yyyy-MM-dd hh:mm:ss').format(now));
  print(DateFormat.yMMMMd().format(now)); // print long date 
  print(DateFormat.yMd().format(now)); // print short date 
  print(DateFormat.jms().format(now)); // print time 

  initializeDateFormatting('es'); // This will initialize Spanish locale
  print(DateFormat.yMMMMd('es').format(now)); // print long date in Spanish format
  print(DateFormat.yMd('es').format(now)); // print short date in Spanish format
  print(DateFormat.jms('es').format(now)); // print time in Spanish format
}

结果:

May 31, 2020 5:41:42 PM
2020-05-31 05:41:42
May 31, 2020
5/31/2020
5:41:42 PM
31 de mayo de 2020
31/5/2020
17:41:42

这是最佳解决方案,因为它适应本地化。 - Matias de Andrea

41

35

1
你的代码使用了 DateFormat 但是你的文本中却写着 DateTime.format() - Michel Feinstein
糟糕!出了个错。已更正 :) - Shashank
此问题专门涉及将 DateTime 转换为 String (格式化)。如果您想将 String 转换为 DateTime(解析),请参见 https://dev59.com/ZFUM5IYBdhLWcg3wEM4d/。 - jamesdlin

23

如果您不想添加其他库,您也可以使用此方法

  DateTime dateTime = DateTime.now();
  String YYYY_MM_DD = dateTime.toIso8601String().split('T').first;
  print(YYYY_MM_DD); //2020-11-23


21

这将为您提供类似社交网络的日期格式:["今天","昨天","星期几",等等..]

void main() {
      DateTime now = new DateTime(2018,6,26);
      print(date(now));
    }
    
    String date(DateTime tm) {
      DateTime today = new DateTime.now();
      Duration oneDay = new Duration(days: 1);
      Duration twoDay = new Duration(days: 2);
      Duration oneWeek = new Duration(days: 7);
      String month;
      switch (tm.month) {
        case 1:
          month = "january";
          break;
        case 2:
          month = "february";
          break;
        case 3:
          month = "march";
          break;
        case 4:
          month = "april";
          break;
        case 5:
          month = "may";
          break;
        case 6:
          month = "june";
          break;
        case 7:
          month = "july";
          break;
        case 8:
          month = "august";
          break;
        case 9:
          month = "september";
          break;
        case 10:
          month = "october";
          break;
        case 11:
          month = "november";
          break;
        case 12:
          month = "december";
          break;
      }
    
      Duration difference = today.difference(tm);
    
      if (difference.compareTo(oneDay) < 1) {
        return "today";
      } else if (difference.compareTo(twoDay) < 1) {
        return "yesterday";
      } else if (difference.compareTo(oneWeek) < 1) {
        switch (tm.weekday) {
          case 1:
            return "monday";
          case 2:
            return "tuesday";
          case 3:
            return "wednesday";
          case 4:
            return "thursday";
          case 5:
            return "friday";
          case 6:
            return "saturday";
          case 7:
            return "sunday";
        }
      } else if (tm.year == today.year) {
        return '${tm.day} $month';
      } else {
        return '${tm.day} $month ${tm.year}';
      }
    }

3
非常有用-谢谢。如果您正在传递包含时间的日期,请在方法顶部添加此额外行,否则“昨天”可能无法正常工作: tm = DateTime(tm.year,tm.month,tm.day); - Nick Wright
不如使用@RodyDavis的答案,使用import 'package:intl/intl.dart';而不是switch语句。 String formatDate(DateTime date) => new DateFormat("MMMM").format(date);这样做还可以为那些想要将其显示为西班牙语、阿拉伯语等的人设置它。 这些额外的步骤可以在此SO中找到。 - Josh Pachner
使用DateFormat("EEEE")来表示日期的星期几。 - Josh Pachner

19
你可以使用intl包在flutter中格式化日期。
void main() {
  final DateTime now = DateTime.now();
  final DateFormat format = DateFormat('yyyy-MM-dd');
  final String formatted = format.format(now);
  // 2021-03-02
}

或者你可以使用date_format包来在Flutter中格式化日期。

import 'package:date_format/date_format.dart';

final formattedStr = formatDate(DateTime.now(), [dd, '-', mm, '-', yyyy]);

//02-03-2021

16

另一种方法是使用intl包。

创建一个DateTime的扩展:

date_time_extension.dart

import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart';

extension DateTimeExtension on DateTime {
  String format([String pattern = 'dd/MM/yyyy', String? locale]) {
    if (locale != null && locale.isNotEmpty) {
      initializeDateFormatting(locale);
    }
    return DateFormat(pattern, locale).format(this);
  }
}

在你要使用DateTime类型的地方导入这个文件,然后你可以像这样使用它:

DateTime.now().format();

DateTime.now().format('MM/yyyy');

DateTime.now().format('MM/yyyy', 'es');

13

有一个名为date_format的包

dependencies:
    date_format:

代码

import 'package:date_format/date_format.dart';

final formattedStr = formatDate(
    yourDateTime, [dd, '.', mm, '.', yy, ' ', HH, ':', nn]);

// output example "29.03.19 07:00"

请注意:分钟是nn

链接到该包的页面


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