intl包和日期格式化奇怪的行为

时间:2016-03-23 09:18:11

标签: internationalization dart intl

我开始在我的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>).

我无法理解为什么我应该在此代码段中传递区域设置

10 个答案:

答案 0 :(得分:5)

如果遇到此问题,请在“材料应用”的顶部写下initializeDateFormatting('az');。我搜索了1个小时,却没人清楚地写出来。

这真的解决了。 enter image description here

答案 1 :(得分: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);

有关我使用的更多信息:

  • dart 1.15.0
  • intl 0.12.7

答案 2 :(得分:4)

无需直接从您的代码中调用 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));
}

答案 3 :(得分:3)

intl:^ 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';

答案 4 :(得分:3)

在main中使用这个函数

initializeDateFormatting();

并像这样导入

import 'package:intl/date_symbol_data_local.dart';

答案 5 :(得分:1)

验证您的进口商品:

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

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

initializeDateFormatting('pt_BR', null);

答案 6 :(得分:1)

  • 在您的pubspec.yaml中,添加以下依赖包:intl:

  • 在最高的StatefulWidget(在dart文件中)中,添加以下导入:

    import 'package:intl/intl.dart';
    import 'package:intl/date_symbol_data_local.dart';
  • 在其状态中,覆盖initState add:
      @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);

答案 7 :(得分:0)

我遇到了同样的错误。但是,仅当在应用内的区域设置(“ en”和“ si”)之间切换时。没有其他解决方案对我有用。因此,我只是想出了这个最愚蠢的解决方案,它确实有效。只是在catch块内调用initializeDateFormatting()时将日期格式包装在try-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);
    }
}

答案 8 :(得分:0)

我的问题是,即使我不是特别使用“ en_US”语言环境,我也会遇到错误。但是我通过以下方法解决了这个问题:

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

答案 9 :(得分:0)

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

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);