Получить дату в текущем часовом поясе на Java
Я уже несколько часов ищу в интернете, как получить дату и время в часовом поясе моей системы.
Когда я использую метод <code>calendar.getTimezone.getDefaultName()</code>
, он всегда возвращает <code>GMT</code>
. На самом деле, он должен возвращать мой текущий часовой пояс, который - <code>IST</code>
.
Я пытаюсь конвертировать строку "2014-02-14T06:04:00:00", которая находится в формате <code>GMT</code>
, в дату и время моего часового пояса. Однако в результате я всегда получаю то же самое время в <code>GMT</code>
.
Все, что я нахожу, это рекомендации использовать <code>Timezone</code>
, например:
dateFormatter.setTimezone("любой_произвольный_часовой_пояс");
Проблема в том, что моё приложение будет использоваться в разных географических регионах. Я не могу установить его на конкретный часовой пояс. Он должен быть настроен на часовой пояс системы, чтобы отображать время в том часовом поясе, в котором находится пользователь.
Помогите, пожалуйста, разобраться с этой проблемой!
2 ответ(ов)
Вот способ получить идентификатор TimeZone
, который соответствует смещению вашего локального системного времени:
Calendar cal = Calendar.getInstance();
long milliDiff = cal.get(Calendar.ZONE_OFFSET);
// Получили локальное смещение, теперь перебираем доступные идентификаторы временных зон.
String[] ids = TimeZone.getAvailableIDs();
String name = null;
for (String id : ids) {
TimeZone tz = TimeZone.getTimeZone(id);
if (tz.getRawOffset() == milliDiff) {
// Найдено совпадение.
name = id;
break;
}
}
System.out.println(name);
Этот код создает экземпляр Calendar
, чтобы получить смещение часового пояса вашей локальной системы. Затем он перебирает все доступные идентификаторы временных зон и сравнивает их смещения. В случае совпадения, идентификатор временной зоны сохраняется и выводится на экран.
Ваша задача заключается в преобразовании даты из одного формата в другой, а также в изменении временной зоны. Вы используете Java для этого, и приведенный вами код выглядит вполне правильным, но с небольшими недочетами. Давайте разберем его подробнее.
Вот пример исправленного кода с пояснениями:
private String receivedFormat = "yyyy-MM-dd'T'HH:mm:ss"; // Исходный формат даты
private String expectedFormat = "dd-MM-yyyy HH:mm:ss"; // Ожидаемый формат даты
// В вашем тестовом классе добавьте следующие строки
String dateString = "2018-08-14T07:00:00"; // Заменил на правильный формат
String returnString = correctDateFormat(dateString, receivedFormat, expectedFormat);
String result = getTimeInSelectedLocale(returnString);
Log.i("Ayaz", "Date: " + result);
/**
* @param receivedDate - принимаемая дата в строковом формате
* @param givenFormat - формат, в котором дан receivedDate
* @param expectedFormat - формат, в который нужно преобразовать
* @return возвращает дату воexpectedFormat
*/
public static String correctDateFormat(String receivedDate, String givenFormat, String expectedFormat) {
if (TextUtils.isEmpty(receivedDate)) {
return "";
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(givenFormat);
Date newDate = null;
try {
newDate = simpleDateFormat.parse(receivedDate);
} catch (ParseException e) {
e.printStackTrace();
}
simpleDateFormat = new SimpleDateFormat(expectedFormat);
return simpleDateFormat.format(newDate); // Возвращаем отформатированную дату
}
/**
* @param dateString - строка с датой
* @return дата в выбранной локали
*/
public String getTimeInSelectedLocale(String dateString) {
if (TextUtils.isEmpty(dateString)) {
return dateString;
}
SimpleDateFormat sdf = new SimpleDateFormat(expectedFormat);
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata")); // Настройка часового пояса (IST)
Date date1 = null;
try {
date1 = sdf.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
sdf.setTimeZone(TimeZone.getTimeZone(TimeZone.getDefault().getID())); // Установка текущего часового пояса
return sdf.format(date1); // Возвращаем дату в новой локали
}
// Пример использования: я преобразую время IST "2018-08-14T07:00:00" в локальное время ОАЭ (Дубай), например, "14-08-2018 05:30:00".
Обратите внимание на несколько исправлений:
- В строке с
dateString
удалено лишнее:00
, потому что форматreceivedFormat
предполагает только 6 цифр (часы, минуты, секунды). - Метод
correctDateFormat
возвращает отформатированную дату как строку прямо в конце. - Вы добавили комментарии для лучшего понимания кода, что очень важно в документации.
Если у вас есть какие-либо конкретные проблемы или вопросы по коду, пожалуйста, сообщите, и я с радостью помогу!
Почему вычитание этих двух временных меток (эпохи в миллисекундах) из 1927 года даёт странный результат?
Как получить текущую дату и время в UTC или GMT в Java?
Сортировка ArrayList пользовательских объектов по свойству
Как рассчитать количество дней между двумя заданными датами
Как вывести дату в стандартном формате?