Как получить местное время из определенной строки, добавив чч: мм

У меня есть эта дата в этом формате:

String date = "2018-12-08T07:50:00+01:00";

И я хотел бы получить местное время в этом формате (добавляя часы по Гринвичу), но я не могу этого сделать

date = "2018-12-08 08:50:00";

Другой пример:

String date = "2018-12-08T07:50:00+04:00";

Результат:

date = "2018-12-08 11:50:00";

Любая помощь?


person hector s.    schedule 19.08.2018    source источник
comment
Аналогично преобразовать OffsetDateTime в отметку времени UTC (хотя, скорее всего, это не точная копия). Я думаю, вы должны быть в состоянии собрать ответ из того, что может дать вам ваша поисковая система.   -  person Ole V.V.    schedule 19.08.2018


Ответы (2)


Как Сан уже сказал в другом ответе, вы неправильно поняли: 2018-12-08T07:50:00+01:00 - это тот же момент времени, что и 2018-12-08 06:50:00 в UTC (примерно то же самое как GMT), а не 08:50. +01:00 означает, что время исходит из места, где часы опережают UTC на 1 час, поэтому, чтобы получить время UTC, нужно вычесть 1 час, а не добавить.

    DateTimeFormatter desiredFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    String date = "2018-12-08T07:50:00+01:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(date);
    OffsetDateTime dateTimeInUtc = dateTime.withOffsetSameInstant(ZoneOffset.UTC);
    date = dateTimeInUtc.format(desiredFormatter);
    System.out.println(date);

Вывод из этого фрагмента:

2018-12-08 06:50:00

Используя ваш другой пример, 2018-12-08T07:50:00+04:00, вывод

2018-12-08 03:50:00

Я пользуюсь тем, что ваша строка имеет формат ISO 8601. OffsetDateTime анализирует этот формат по умолчанию, то есть нам не нужно указывать формат в DateTimeFormatter (как мы делаем для желаемого формата результата).

Ссылка: Статья в Википедии: ISO 8601

person Ole V.V.    schedule 19.08.2018

2018-12-08T07:50:00+01:00, +01:00 в конце не означает adding hh:mm, это означает, что дата-время уже является локальной датой, в GMT это 2018-12-08T06:50:00.

Вы можете использовать string.replaceAll для удаления T и +01:00:

String input = "2018-12-08T07:50:00+01:00";
input = input.replaceAll("T", " ");
input = input.replaceAll("\\+.*", "");
System.out.println(input);  // 2018-12-08 07:50:00

или проанализируйте и переформатируйте его:

OffsetDateTime offsetDateTime = OffsetDateTime.parse("2018-12-08T07:50:00+01:00");
String time = offsetDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T", " ");
System.out.println(time); // 2018-12-08 07:50:00
person xingbin    schedule 19.08.2018
comment
Я явно предпочитаю синтаксический анализ и переформатирование низкоуровневой строковой операции с использованием регулярных выражений. Также в любом случае нужно сохранить дату-время в переменной типа OffsetDateTime. - person Ole V.V.; 19.08.2018
comment
@ОлеВ.В. Если результат только для пользовательского интерфейса, то эти два подхода не имеют значения. В противном случае предпочтение отдается второму. - person xingbin; 19.08.2018