Вам не нужен явный форматер. В Java (потому что это то, что я могу написать):
String lastDate = "2020-04-04T07:05:57+00:00";
OffsetDateTime serverDateTime = OffsetDateTime.parse(lastDate);
ZonedDateTime clientDateTime
= serverDateTime.atZoneSameInstant(ZoneId.systemDefault());
System.out.println("serverDateTime: " + serverDateTime);
System.out.println("clientDateTime: " + clientDateTime);
Вывод в моем часовом поясе:
serverDateTime: 2020-04-04T07:05:57Z
clientDateTime: 2020-04-04T09:05:57+02:00[Europe/Copenhagen]
Формат строки из вашего сервером является ISO 8601. Классы java .time анализируют наиболее распространенные варианты ISO 8601 как их значения по умолчанию, то есть без указания какого-либо форматера.
Поскольку строка на вашем сервере имеет UT C смещение, +00: 00 и отсутствие часового пояса, как в Азии / Сеуле, OffsetDateTime
- лучшее и наиболее правильное время для него. С другой стороны, время клиента имеет часовой пояс, поэтому ZonedDateTime
здесь хорошо.
Поскольку время сервера и клиента обозначают одно и то же время, разница всегда будет равна нулю:
Duration difference = Duration.between(serverDateTime, clientDateTime);
System.out.println(difference);
PT0S
Читается как период времени 0 секунд (это тоже формат ISO 8601).
Если вы хотите узнать разницу между текущим временем и сервером время, используйте now()
:
Duration difference = Duration.between(serverDateTime, OffsetDateTime.now());
System.out.println(difference);
Что пошло не так в вашем коде?
Во-первых, смещение UT C в вашей строке равно +00:00
. Ни одна буква шаблона формата Z
, ни литерал Z
не будут соответствовать этому. Так что не пытайся. Во-вторых, никогда дает Z
как литерал, заключенный в одинарные кавычки в строке шаблона формата. Когда Z
отображается как смещение, что является обычным явлением, вам необходимо проанализировать его как смещение, а не как литерал. В-третьих, буквенный текст в строке шаблона формата должен иметь одинарную кавычку до и одну кавычку после него. Вы делаете это правильно для T
в середине. Если вы не хотели Z
быть буквальным, не ставьте перед ним ни одной кавычки. Если вы действительно подразумеваете, что это буквально - как я уже сказал, просто не надо.
Ссылки