【问题标题】:How do I format a date with Dart?如何用 Dart 格式化日期?
【发布时间】:2013-04-14 03:26:01
【问题描述】:

我有一个DateTime 的实例,我想将其格式化为字符串。我怎么做?我想把日期变成一个字符串,比如“2013-04-20”。

【问题讨论】:

    标签: dart


    【解决方案1】:

    您可以使用 intl 包 (installer) 来格式化日期。

    对于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 docs 了解更多信息。 date_symbol_data_local.dart 包含每个国家/语言的所有格式,如果您想更深入地了解的话。

    【讨论】:

    • 国际线坏了吗?未捕获的错误:FileSystemException:无法打开文件,路径 = 'E:\dart\ws\web\packages\intl\intl.dart'(操作系统错误:系统找不到指定的路径。
    • 有没有办法在格式中增加毫秒?
    • 在 pubspec.yaml 依赖项中需要:intl: ^0.15.7
    • 我们怎样才能只获取月份,例如。 1 月 1 日,2 月 2 日 ... ?我试过 DateFormat('MM').format(DateTime.now());但在颤动中不起作用。请分享您的建议。
    • @Kaspi try 'S' 表示小数秒
    【解决方案2】:

    这也可以:

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

    【讨论】:

    • 不建议这样做,因为它未在用户区域设置中本地化。
    • @DustinB 你确定吗?在我的情况下它似乎是本地化的,但如果不是,那么只需转换它。 DateTime.toLocal() 应该可以解决问题。
    • 嗯,它正在以 YEAR-MM-DD 的格式进行字符串连接。这可能与您当前的语言环境相匹配,但绝对不是所有人。例如,在美国,更可能使用 MM/DD/YYYY。
    【解决方案3】:

    您还可以指定日期格式,如前所述:https://pub.dev/documentation/intl/latest/intl/DateFormat-class.html

    import 'package:intl/intl.dart';
    String formatDate(DateTime date) => new DateFormat("MMMM d").format(date);
    

    产生:March 4

    【讨论】:

      【解决方案4】:

      如果有人想将字符串格式的日期转换为其他字符串格式,请先使用 DateTime.parse("2019-09-30") 然后将其传递给 DateFormat("date pattern").format() 像

      dateFormate = DateFormat("dd-MM-yyyy").format(DateTime.parse("2019-09-30"));
      

      参考:Dart - How to change format of simple date string which is in yyyy-MM-dd to dd-MM-yyyy

      【讨论】:

      • 您的代码使用DateFormat,但您的文字显示DateTime.format()
      • 糟糕!一个错误。改变了:)
      • 这个问题专门关于将DateTime 转换为String(格式)。如果要将String 转换为DateTime(解析),请参阅stackoverflow.com/q/49385303
      【解决方案5】:

      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
      

      【讨论】:

        【解决方案6】:

        这会给你在社交网络中的日期:[“today”,“yesterday”,“dayoftheweek”等..]

        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}';
              }
            }
        

        【讨论】:

        • 非常有用 - 谢谢。如果您要传递有时间的日期,请在方法顶部添加此附加行,否则“昨天”可能不起作用:tm = DateTime(tm.year, tm.month, tm.day);
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          有一个包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

          link to the package

          【讨论】:

            【解决方案9】:

            您可以使用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
            

            【讨论】:

              【解决方案10】:

              另一种方式。

              创建 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');
              

              【讨论】:

                【解决方案11】:
                /// Get date as a string for display.
                String getFormattedDate(String date) {
                  /// Convert into local date format.
                  var localDate = DateTime.parse(date).toLocal();
                
                  /// inputFormat - format getting from api or other func.
                  /// e.g If 2021-05-27 9:34:12.781341 then format must be yyyy-MM-dd HH:mm
                  /// If 27/05/2021 9:34:12.781341 then format must be dd/MM/yyyy HH:mm
                  var inputFormat = DateFormat('yyyy-MM-dd HH:mm');
                  var inputDate = inputFormat.parse(localDate.toString());
                
                  /// outputFormat - convert into format you want to show.
                  var outputFormat = DateFormat('dd/MM/yyyy HH:mm');
                  var outputDate = outputFormat.format(inputDate);
                
                  return outputDate.toString();
                } 
                

                【讨论】:

                  【解决方案12】:

                  如果您想将多种日期格式合二为一,我们可以使用intl

                  DateFormat('yMMMd').addPattern(DateFormat.HOUR24_MINUTE).format(yourDateTime))
                  

                  【讨论】:

                    【解决方案13】:

                    处理从字符串到日期时间的年度季度,我没有找到合适的解决方案,所以做了这个:

                        List<String> dateAsList = 'Q1 2001'.split(' ');
                        DateTime dateTime = DateTime.now();
                        String quarter = dateAsList[0];
                        int year = int.parse(dateAsList[1]);
                        switch(quarter) {
                          case "Q1": dateTime = DateTime(year, 1);
                          break;
                          case "Q2": dateTime = DateTime(year, 4);
                          break;
                          case "Q3": dateTime = DateTime(year, 7);
                          break;
                          case "Q4": dateTime = DateTime(year, 10);
                          break;
                        }
                    

                    【讨论】:

                      【解决方案14】:

                      无依赖方法[将日期显示为格式化字符串]

                      如果您想将 DateTime 值显示为日/月/年或您喜欢的任何其他格式,字符串插值会很方便:

                      "${_date.day} / ${_date.month} / ${_date.year}"
                      

                      样本输出:

                      23 / 4 / 1920

                      我不想使用任何额外的库,所以我就这样走了。

                      【讨论】:

                        【解决方案15】:
                        import 'package:intl/intl.dart';
                        
                        main() {
                          var formattedDate = new DateTime.Format('yyyy-MM-dd').DateTime.now();
                          print(formattedDate); // something like 2020-04-16
                        }
                        

                        更多详情可以参考DateFormat Documentation

                        【讨论】:

                          【解决方案16】:
                          String formatDate(String date) {
                              return date.substring(0, 10).split('-').reversed.join().replaceAll('-', '/');
                              
                            }
                          

                          从格式“yyyy-mm-dd H:i:s”

                          【讨论】:

                            【解决方案17】:
                             String dateConverter(String date) {
                                // Input date Format
                                final format = DateFormat("dd-MM-yyyy");
                                DateTime gettingDate = format.parse(date);
                                final DateFormat formatter = DateFormat('yyyy-MM-dd');
                                // Output Date Format
                                final String formatted = formatter.format(gettingDate);
                                return date;
                              }
                            

                            【讨论】:

                              【解决方案18】:

                              更简单的方法:

                              new DateFormat("dd-MM-y").format(YOUR_DATETIME_HERE)
                              

                              【讨论】:

                              • 以前的答案似乎已经涵盖了这一点。
                              【解决方案19】:

                              使用“H:mm”查看完整的分钟数,例如 13:08 而不是 13:8

                              【讨论】:

                              【解决方案20】:

                              要获得包含日期和时间的用户友好型字符串,您可以使用:

                              import 'package:intl/intl.dart';
                              
                              main() {
                                final DateTime someDateTime = DateTime(2017, 9, 7, 17, 30);
                                final DateFormat formatter = DateFormat.yMMMd().add_jms();
                                final String formatted = formatter.format(someDateTime);
                                print(formatted); // Sep 7, 2017 5:30:00 PM (in the US)
                              }
                              

                              【讨论】:

                                猜你喜欢
                                • 2021-03-21
                                • 2021-01-17
                                • 2020-08-07
                                • 2011-10-06
                                • 1970-01-01
                                • 2020-12-03
                                • 2019-03-13
                                • 1970-01-01
                                相关资源
                                最近更新 更多