0

Получить дату в текущем часовом поясе на Java

8

Я уже несколько часов ищу в интернете, как получить дату и время в часовом поясе моей системы.

Когда я использую метод <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 ответ(ов)

0

Вот способ получить идентификатор 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, чтобы получить смещение часового пояса вашей локальной системы. Затем он перебирает все доступные идентификаторы временных зон и сравнивает их смещения. В случае совпадения, идентификатор временной зоны сохраняется и выводится на экран.

0

Ваша задача заключается в преобразовании даты из одного формата в другой, а также в изменении временной зоны. Вы используете 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".

Обратите внимание на несколько исправлений:

  1. В строке с dateString удалено лишнее :00, потому что формат receivedFormat предполагает только 6 цифр (часы, минуты, секунды).
  2. Метод correctDateFormat возвращает отформатированную дату как строку прямо в конце.
  3. Вы добавили комментарии для лучшего понимания кода, что очень важно в документации.

Если у вас есть какие-либо конкретные проблемы или вопросы по коду, пожалуйста, сообщите, и я с радостью помогу!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь