【问题标题】:intl package and date formatting strange behaviour国际包和日期格式奇怪的行为
【发布时间】:2016-07-10 11:59:36
【问题描述】:

我开始在我的 dart 项目中使用 intl 包。 开始使用这个包后,我使用这个代码:

  DateTime now = new DateTime.now();
  var formatter = new DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  String nowFormatted = formatter.format(now);

而且它工作正常。 在我使用 intl 后,我在日志中获得了这条消息:

Uncaught LocaleDataException: Locale data has not been initialized, call initializeDateFormatting(<locale>).

我不明白为什么我应该在这段代码 sn-p 中传递语言环境

【问题讨论】:

  • 它包含在 date_format.dart 中。在文件的标题中,我看到了 intl 的一部分;
  • @ThierryTemplier Dart intl 与 JS intl 无关。
  • 您的代码为我打印2016-03-23T10:39:03Z。哪一行导致您的异常?您的pubspec.lock 文件中列出了哪个版本的intl

标签: internationalization dart intl


【解决方案1】:

国际:^0.15.7

我对当前的Intl 版本有同样的问题,所以我已经解决了

这些进口:

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

和代码:

initializeDateFormatting();
DateTime now = DateTime.now();
var dateString = DateFormat('dd-MM-yyyy').format(now);
final String configFileName = 'lastConfig.$dateString.json';

【讨论】:

  • 这个没有参数的initializeDateFormatting() 在最新版本intl: ^0.16.1 中不起作用。有什么解决办法吗?
  • @FaizanMubasher 你有没有尝试过例如:initializeDateFormatting('de_DE', null)
  • @FaizanMubasher,我也有同样的把握。确保您有此导入:import 'package:intl/date_symbol_data_local.dart';,因为 initializeDateFormatting 包含多个文件。
  • 它必须是date_symbol_data_local(忽略第二个参数)而不是date_symbol_data_file
  • initializeDateFormatting 是一个未来,所以你必须await initializeDateFormatting()initializeDateFormatting().then((_) =&gt; runMyCode()) 以避免意外结果(否则它可能在你使用 DateFormat 之前实际上没有完成初始化)
【解决方案2】:

验证您的导入:

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

根据你的语言设置initializeDateFormatting,例如:

initializeDateFormatting('pt_BR', null);

【讨论】:

    【解决方案3】:

    如果您遇到这个问题,请在“Material App”的顶部写initializeDateFormatting('az');。找了1个小时都没人写清楚。

    真的解决了。

    【讨论】:

    • build 中执行此操作可能不是一个好主意。它可能被多次调用。也许改用initState 做吧
    【解决方案4】:

    我已经通过这种方式解决了这个用法:

    DateTime now = new DateTime.now();
    var formatter = new DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", 'en');
    String nowFormatted = formatter.format(now);
    

    但我必须将其添加到用于配置 itnl 支持的 dart 文件中:

    library translation_helper;
    
    import 'dart:async';
    import 'package:intl/date_symbol_data_local.dart';
    import '../../resources/messages_all.dart';
    
    
    void setupLanguage(){
      //var germanDatesFuture = initializeDateFormatting('de_DE', null);
      var enDatesFuture = initializeDateFormatting('en', null);
      var germanMessagesFuture = initializeMessages('de');
      var englishMessagesFuture = initializeMessages('en');
      var italianMessagesFuture = initializeMessages('it');
      var polishMessagesFuture = initializeMessages('pl');
      Future
          .wait([
        enDatesFuture,
        germanMessagesFuture,
        englishMessagesFuture,
        italianMessagesFuture,
        polishMessagesFuture
      ]);
    }
    

    在我失踪之前:

     var enDatesFuture = initializeDateFormatting('en', null);
    

    有关我使用的更多信息:

    • 飞镖 1.15.0
    • 国际版 0.12.7

    【讨论】:

    • 有趣。为什么你需要它,而它对我有用。您使用的是什么操作系统?
    • Boring OSX 最新版本-_-
    • 是的,您必须先初始化特定语言环境的格式,然后才能使用它。在某些情况下,数据已经加载,但在其他情况下(最常见的消息,数据会占用大量空间)可能需要先加载数据才能使用。通常,您不会为每个语言环境初始化所有消息,只为您的用户语言环境初始化一个。
    • 你把配置放在哪里?
    【解决方案5】:
    • 在您的 pubspec.yaml 中,添加此依赖包:intl:

    • 在您最高的 StatefulWidget(在您的 dart 文件中)中,添加这些导入:

        import 'package:intl/intl.dart';
        import 'package:intl/date_symbol_data_local.dart';
    
    • 在其状态中,覆盖 initState 添加:
          @override
          void initState() {
            super.initState();
            initializeDateFormatting(); //very important
          }
    
    • 还有代码:
         DateTime now = new DateTime.now();
         var formatter = new DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
         String nowFormatted = formatter.format(now);
    

    【讨论】:

      【解决方案6】:

      我的问题是,即使我没有特别使用“en_US”语言环境,我也遇到了专门的错误。但我通过以下方式解决了它:

      initializeDateFormatting('en', null);
      initializeDateFormatting('en_US,', null);
      

      【讨论】:

        【解决方案7】:

        无需直接从您的代码中调用 initializeDateFormatting。只需调用应用本地化代理的 load 方法。

        所以你可以像这样指定委托:

        final localizationsDelegates = <LocalizationsDelegate>[
          AppLocalizationsDelegate(),
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
          CupertinoLocalizationsDelegate()
        ];
        
        ...
        
          MaterialApp(
            localizationsDelegates: localizationsDelegates,
          )
        

        并使用系统的语言环境预加载它们:

        import 'dart:ui' as ui;
        
        ...
        
        for (final delegate in localizationsDelegates) {
          await delegate.load(ui.Locale(ui.window.locale.languageCode));
        }
        

        【讨论】:

          【解决方案8】:

          在main中使用这个函数

          initializeDateFormatting();
          

          并像这样导入

          import 'package:intl/date_symbol_data_local.dart';

          【讨论】:

            【解决方案9】:

            我遇到了同样的错误。但是,只有在应用程序内的区域设置(“en”和“si”)之间切换时。其他解决方案都不适合我。所以我只是想出了这个最愚蠢的解决方案,它奏效了。只是将日期格式包装在 try-catch 块中,而 initializeDateFormatting() 在 catch 块中被调用

            String  date(DateTime date, String _languageCode) {
                try {
                    var formatter = new DateFormat.yMMMMd(_languageCode);
                    return formatter.format(date);
                } catch(e) {
                    initializeDateFormatting();
                    var formatter = new DateFormat.yMMMMd(_languageCode);
                    return formatter.format(date);
                }
            }
            

            【讨论】:

              【解决方案10】:

              根据系统区域设置初始化日期格式。

              import 'package:intl/intl_standalone.dart'; // For standlone app
              import 'package:intl/intl_browser.dart'; // For standlone app
              import 'package:intl/date_symbol_data_local.dart';
              ...
              await initializeDateFormatting(await findSystemLocale(), null);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-26
                • 1970-01-01
                • 2019-04-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多