Мое приложение получает ответ от моего сервера с датой и временем прошлых событий. Мой сервер, однако, находится в другом часовом поясе, и здесь все становится немного сложнее. Часовой пояс сервера - UTC +01:00
, а мой - UTC +03:00
. Когда я получаю ответы от сервера, они приходят с отметкой времени в UTC +01:00
. Сначала я попытался получить дату в виде String
, подставив ее в строку, установив ее часовой пояс, а затем вернув ее в надлежащем формате и часовом поясе. (Я вырезал последние 4 цифры милисека, потому что DateFormat
был недействительным в противном случае.)
private String getFormattedDate(String date) {
DateFormat serverDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
DateFormat finalDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
Calendar calendar = Calendar.getInstance();
TimeZone timeZone = calendar.getTimeZone();
serverDateFormat.setTimeZone(timeZone);
String cutoutDate = date.substring(0,23);
String cutoutZone = date.substring(27, date.length());
String dateInProperFormat = cutoutDate + cutoutZone;
Date finalDate = serverDateFormat.parse(dateInProperFormat);
return finalDateFormat.format(finalDate);
}
Это прочитало и преобразовало все правильно:
Ответ сервера: 2018-04-30T07:26:55.1524511+01:00
-> Подстроковой ответ: 2018-04-30T07:26:55.152+01:00
-> Окончательный формат: 30-04-2018 09:26:55
Однако milisec не всегда было 7, поэтому, когда это произошло, я получил ошибку Unparsable date
. Это заставило меня прочитать дату не как String
, а как Date
. Это сократить код только до 5 строк:
private String getFormattedDate(Date date) {
SimpleDateFormat finalDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
Calendar calendar = Calendar.getInstance();
TimeZone timeZone = calendar.getTimeZone();
finalDateFormat.setTimeZone(timeZone);
return finalDateFormat.format(date);
}
Но сейчас время всегда в UTC +01:00
. Я пытался получить часовой пояс так:
TimeZone timeZone = TimeZone.getDefault();
Но это ничего не изменило. Что именно я делаю неправильно во втором подходе? Я готов поделиться своим кодом, если это необходимо.