在Flutter中解析JSON日期

4

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

在解析时,我遇到了以下异常: FormatException (FormatException: Invalid date format /Date(1559985189000+0300)/)

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

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

是否有一种内置方法可以在Flutter中解析此日期字符串为DateTime,或者我应该自己实现它?

非常感谢!

1个回答

2
你需要实现它;由于你没有说明服务器提供了什么,所以你需要进行一些实验。还要注意的是,Dart的日期只支持两个时区:UTC或本地时间。(timezone包提供了整个奥尔森数据库,用于操作其他时区。)
根据问题中的数字和你提问的时间,我们假设日期是在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]);

这将为您获取手机所在时区的DateTime:
  var local = DateTime.fromMillisecondsSinceEpoch(millis);

这将为您提供UTC时间:

最初的回答:

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

这将为您提供雅典和协调世界时之间的偏移量,但可能没有用处:(请注意,即使我们可以推断出您的服务器位于雅典(或类似的时区),但如果不使用时区包,我们无法获取雅典时区的日期 - 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,
  );

非常感谢您的详细解释! - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接