在Flutter中解析JSON日期

时间:2019-06-08 10:49:06

标签: json datetime parsing flutter

我应该在Flutter应用中使用的API响应包含JSON格式的日期,格式如下:/ Date(1559985189000 + 0300)/

解析时,我有以下异常: FormatException(FormatException:无效的日期格式 /日期(1559985189000 + 0300)/)

我使用以下代码来解析:date: DateTime.parse(json["Date"])

日期字符串对我来说似乎是unix的时间戳。

是否有内置的方法将此日期字符串解析为Flutter中的DateTime,还是应该实现它?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您必须实现它;而且您还需要进行一些实验,因为您还没有说服务器实际提供了什么。还需要注意的是,Dart的日期仅支持两个时区:UTC或本地时间。 (timezone程序包提供了用于处理其他时区的整个Olsen数据库。)

根据问题中的数字以及您提出的问题进行猜测,我们假设日期使用UTC,但是服务器使用UTC + 3(例如,希腊雅典)。

首先解析相关位:

  var raw = '/Date(1559985189000+0300)/';

  var numeric = raw.split('(')[1].split(')')[0];
  var negative = numeric.contains('-');
  var parts = numeric.split(negative ? '-' : '+');
  var millis = int.parse(parts[0]);

这将使您在手机的TZ位置DateTime

  var local = DateTime.fromMillisecondsSinceEpoch(millis);

这将为您提供UTC时间:

  var utc = DateTime.fromMillisecondsSinceEpoch(millis, isUtc: true);

这将为您提供雅典和UTC之间的偏移量,但可能无用:(请注意,即使我们可以推断出您的服务器位于雅典(或类似的TZ),我们也无法使用雅典时区获取日期时区软件包-Dart仅支持UTC或手机的时间(可能在苏黎世)

  final multiplier = negative ? -1 : 1;
  var offset = Duration(
    hours: int.parse(parts[1].substring(0, 2)) * multiplier,
    minutes: int.parse(parts[1].substring(2)) * multiplier,
  );