【问题标题】:Date format in Dart which includes GMTDart 中的日期格式,包括 GMT
【发布时间】:2021-01-29 19:46:42
【问题描述】:

如何在 Dart 中将当前时间转换为 GMT/UTC 时间,类似于 javascript 方式:new Date().toUTCString():

格林威治标准时间 2011 年 11 月 1 日星期二 19:06:35

我尝试了几个格式化程序,见下文,但没有成功

//var f = DateFormat('E, d MMM yyyy HH:mm:ss z');
var f = DateFormat('E, d MMM yyyy HH:mm:ss'); 
    var date = f.format(DateTime.now());

【问题讨论】:

  • 但是来自另一个时区的不同用户呢,你想让它也说 GMT 吗?

标签: flutter dart intl


【解决方案1】:

将您的当前时间转换为 UTC 并将" GMT" 附加到字符串。

import 'package:intl/intl.dart';

void main(List<String> arguments) async {
  var f = DateFormat('E, d MMM yyyy HH:mm:ss');
  var date = f.format(DateTime.now().toUtc()) + " GMT";
  print(date);
}


使用任意时区(不仅仅是 GMT/UTC)

虽然它在文档中,但您不能使用 DateTime 创建具有任意时区的字符串,因为缺少时区支持/实现,并且是 2015 年以来的 GitHub 问题。例如,您不能显示不同的时区在字符串中,因为在格式字符串中使用z 不起作用:调用者得到UnimplementedError。请参阅 3 个相关的 GitHub 问题:onetwothree

UnimplementedError
#0      _DateFormatPatternField.formatTimeZone (package:intl/src/intl/date_format_field.dart:640:5)
#1      _DateFormatPatternField.formatField (package:intl/src/intl/date_format_field.dart:381:16)
#2      _DateFormatPatternField.format (package:intl/src/intl/date_format_field.dart:244:12)
#3      DateFormat.format (package:intl/src/intl/date_format.dart:276:26)
#4      main (file:///Users/benbutterworth/datetime/bin/datetime.dart:11:16)
<asynchronous suspension>
#5      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#6      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)

【讨论】:

  • var f = DateFormat('E, d MMM yyyy HH:mm:ss z') 抛出 UnimplementedError。
  • 那是因为它还没有实现,看我编辑的答案?
  • 我正在将 javascript 等效语句 new Date().toUTCString() 转换为等效 dart。我知道 dart 中有 utc 方法,但不会产生此输出。
  • 好的,所以在这种情况下,您可以在将当前时间转换为 UTC/GMT 时间后附加“GMT”。这不是“GMT”的问题,而是日期转换,您可以进行hereTimeZone package 的转换。
  • 我想下一次,如果您用更多信息来表达您的问题,我将能够更快地提供帮助。不过,我今天对在没有 Flutter 的情况下运行 dart 很感兴趣,所以我很乐意提供帮助。
【解决方案2】:
var f = DateFormat('EEE, d MMM yyyy HH:mm:ss'); 
var date = f.format(DateTime.now());

此输出日期格式为 Tue, 01 Nov 2011 19:06:35,不含 GMT

【讨论】:

  • 那是我的问题..它没有打印 GMT
  • 然后将它添加为字符串?或者你是说你想要调用它的特定时区?
  • @BenButterworth 我希望当前时间显示为“Tue, 01 Nov 2011 19:06:35 GMT”
  • @AnuranjanSrivastav GMT 是您要在哪个时区打印的一组时区?
  • @savke 我正在将 javascript 等效语句 new Date().toUTCString() 转换为等效 dart。我知道 dart 中有 utc 方法,但不会产生此输出。
【解决方案3】:

最后我发现了如下解决方法

 String getUTCDate() {
    try {
      var f = DateFormat('E, d MMM yyyy HH:mm:ss');
      var now = DateTime.now().toUtc();
      return f.format(now) + ' GMT';
    } catch (e) {
      print('Error ******' + e.toString());
      throw e;
    }
  }

【讨论】:

  • 您的解决方案通常有效,但当 JavaScript 的 new Date().toUTCString() 始终输出两位数天数时,它会输出一位数天数。此外,您可以将“GMT”文字字符串集成到日期格式中。这是我正在使用的代码:var f = DateFormat("E, dd MMM yyyy HH:mm:ss 'GMT'"); var now = DateTime.now().toUtc(); return f.format(now);
  • 您原来的问题是I want to produce an output of date which includes the timezone of the caller。调用 .toUTC 包括 UTC/GMT 的时区,而不是调用者的时区。
猜你喜欢
  • 1970-01-01
  • 2018-04-13
  • 2021-01-17
  • 2011-04-11
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
相关资源
最近更新 更多