Разбор даты JSON во флаттере - PullRequest
0 голосов
/ 08 июня 2019

Ответ API, который я должен использовать в своем приложении Flutter, содержит дату в формате JSON в таком формате: / Date (1559985189000 + 0300) /

При синтаксическом анализе возникает следующее исключение: FormatException (FormatException: Invalidформат даты / Дата (1559985189000 + 0300) /)

Я использую этот код для синтаксического анализа: date: DateTime.parse(json["Date"])

Строка даты кажется мне меткой времени Unix.

Есть ливстроенный способ синтаксического анализа этой строки даты в DateTime во Flutter, или я должен ее реализовать?

Большое спасибо!

1 Ответ

1 голос
/ 09 июня 2019

Вы должны реализовать это; и вам придется немного поэкспериментировать, так как вы еще не сказали, что на самом деле предоставляет ваш сервер. Также следует отметить, что дата Дарт поддерживает только два часовых пояса: 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]);

Это даст вам DateTime в TZ телефона:

  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,
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...