Есть строка с датой и времнем в определенном формате
String date = "Tue Sep 11 08:28:59 EDT 2018";
На выходе хочу получить
11.09.2018 08:28
Но получаю
10.09.2018 15:28
Формат
"EEE MMM d HH:mm:ss z yyyy"
Хочу запарсить дату и вывести ее в другом формате
"dd.MM.yyyy HH:mm"
Моя реализация
public static String getTime(String time, String inFormat, String outFormat) throws ParseException {
Date date = new Date();
SimpleDateFormat simpleFormet = new SimpleDateFormat(inFormat);
SimpleDateFormat simpleFormet2 = new SimpleDateFormat(outFormat);
date = simpleFormet.parse(time)
return simpleFormet2.format(date);
}
Проблема в том что время всегда сбрасывается на текущее, подскажите как правильно сделать
Фокус в том, что ваше время Tue Sep 11 08:28:59 EDT 2018 указано для часового пояса EDT, т.е. UTC-4, а объект Date хранит время по Гринвичу. Соответственно строка
simpleFormet2.format(date);
и дает время на 4 часа больше (а не текущее), чем было передано.
В Java8 появилась новая библиотека для работы со временем java.time. В ней есть класс LocalDateTime который хранит дату вместе с часовым поясом.
Использование:
public static String getTime2(String time, String inFormat, String outFormat) {
DateTimeFormatter simpleFormet = DateTimeFormatter.ofPattern(inFormat);
DateTimeFormatter simpleFormet2 = DateTimeFormatter.ofPattern(outFormat);
LocalDateTime date = LocalDateTime.parse(time, simpleFormet);
return date.format(simpleFormet2);
}
Чтобы дата и время были такими же как изначально, нужно получить значение z в исходной строке. Это можно делать разными способами, в том числе используя Joda DateTime.
String timeZone = date.substring(20,3);
if ("EDT".equals(timeZone)) timeZone = "GMT-4";
simpleFormet2.setTimeZone(TimeZone.getTimeZone(timeZone));
Сборка персонального компьютера от Artline: умный выбор для современных пользователей