6

Как получить текущую дату и время в UTC или GMT в Java?

16

Когда я создаю новый объект Date, он инициализируется текущим временем, но в локальном часовом поясе. Как я могу получить текущую дату и время в формате GMT?

5 ответ(ов)

2

В вашем коде есть несколько моментов, которые стоит учесть.

Вы создаете объект SimpleDateFormat для формата даты в GMT (dateFormatGmt) и устанавливаете для него временную зону GMT. Затем вы создаете другой объект SimpleDateFormat (dateFormatLocal) без указания временной зоны, что означает, что он будет использовать локальную зону по умолчанию.

Также вы используете метод parse для парсинга даты, которую форматировали в GMT. Однако тут есть потенциальная проблема: форматирование и парсинг могут быть некорректно синхронизированы — вы создаете дату в одной временной зоне и пытаетесь распарсить ее в другой.

Если ваша цель — получить дату в локальной временной зоне, то уменьшить вероятность ошибок вы могли бы сделать это следующим образом:

SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));

// Текущая дата в GMT
String gmtDate = dateFormatGmt.format(new Date());

// Параллельно создаем объект для локальной временной зоны
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
Date parsedDate = dateFormatLocal.parse(gmtDate);

// Вернуть дату, но учтите, что она будет в локальной временной зоне
return parsedDate;

Это приведет к тому, что parsedDate будет содержать дату, но в ней будет учтена локальная временная зона. Если вы хотите избежать путаницы, лучше использовать dateFormat с установленной временной зоной и для локальной зоны, если вам это необходимо.

0

Этот код действительно возвращает время в формате UTC как объекты String и Date. Давайте рассмотрим его подробнее:

static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

public static Date getUTCdatetimeAsDate() {
    // Обратите внимание: не проверяется на null
    return stringDateToDate(getUTCdatetimeAsString());
}

public static String getUTCdatetimeAsString() {
    final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // Устанавливаем часовой пояс UTC
    final String utcTime = sdf.format(new Date()); // Форматируем текущее время в строку

    return utcTime; // Возвращаем строку с временем в формате UTC
}

public static Date stringDateToDate(String StrDate) {
    Date dateToReturn = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); // Обратите внимание на правильность переменной DATE_FORMAT

    try {
        dateToReturn = dateFormat.parse(StrDate); // Парсим строку в объект Date
    }
    catch (ParseException e) {
        e.printStackTrace(); // Обрабатываем исключение
    }

    return dateToReturn; // Возвращаем объект Date
}

Объяснение:

  1. В методе getUTCdatetimeAsString() создается объект SimpleDateFormat, который форматирует текущее время, используя указанный формат и временную зону UTC.
  2. getUTCdatetimeAsDate() вызывает getUTCdatetimeAsString() для получения времени в виде строки, а затем передает эту строку в метод stringDateToDate() для преобразования в объект Date.
  3. Метод stringDateToDate() использует SimpleDateFormat для преобразования строки в объект Date, и он обрабатывает возможные исключения при парсинге.

Замечания:

  • Важно убедиться, что переменная DATE_FORMAT используется последовательно во всех местах, где требуется формат даты.
  • Убедитесь, что метод stringDateToDate обрабатывает входные данные корректно (например, проверка на null).
0

Ваш код на Java предназначен для получения текущего времени, определения смещения часового пояса и преобразования его в время по Гринвичу (GMT). Давайте разберем его по шагам.

  1. Вы создаете экземпляр класса Calendar, чтобы получить текущее время:

    Calendar c = Calendar.getInstance();
    System.out.println("current: " + c.getTime());
    
  2. Получаете текущий часовой пояс и его смещение от GMT:

    TimeZone z = c.getTimeZone();
    int offset = z.getRawOffset();
    
  3. Проверяете, действует ли переход на летнее/зимнее время, и при необходимости добавляете смещение:

    if (z.inDaylightTime(new Date())) {
        offset = offset + z.getDSTSavings();
    }
    
  4. Преобразуете смещение в часы и минуты:

    int offsetHrs = offset / 1000 / 60 / 60;
    int offsetMins = offset / 1000 / 60 % 60;
    
  5. Выводите смещения:

    System.out.println("offset: " + offsetHrs);
    System.out.println("offset: " + offsetMins);
    
  6. В конечном итоге вы корректируете текущее время, вычитая смещение:

    c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
    c.add(Calendar.MINUTE, (-offsetMins));
    
  7. И выводите время в формате GMT:

    System.out.println("GMT Time: " + c.getTime());
    

Таким образом, ваш код правильно вычисляет текущее время в формате GMT, исходя из локального времени и заданного часового пояса. Если у вас возникли вопросы или необходима дополнительная помощь, пожалуйста, уточните!

0

В вашем коде действительно время остается одинаковым в любой точке Земли, но его представление может варьироваться в зависимости от выбранного часового пояса. Чтобы изменить представление времени, вам необходимо задать нужный часовой пояс для SimpleDateFormat.

Пример:

SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
f.setTimeZone(TimeZone.getTimeZone("UTC")); // Устанавливаем часовой пояс UTC
System.out.println(f.format(new Date())); // Выводим время в формате UTC

Если вы хотите отобразить время в другом часовом поясе, просто измените строку:

f.setTimeZone(TimeZone.getTimeZone("Europe/Moscow")); // Пример для Москвы

Таким образом, вы можете представлять одно и то же время в зависимости от вашего местоположения, что и влияет на восприятие времени.

0

Этот код позволяет получить миллисекунды в UTC на Android.

Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);  
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;

Здесь мы создаём экземпляр Calendar, затем получаем смещение UTC в миллисекундах, складывая смещения часового пояса и временной зоны (если применяется летнее время). Наконец, добавляем это смещение к миллисекундам текущего времени, чтобы получить значение в UTC.

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