Как получить текущую дату и время в UTC или GMT в Java?
Когда я создаю новый объект Date, он инициализируется текущим временем, но в локальном часовом поясе. Как я могу получить текущую дату и время в формате GMT?
5 ответ(ов)
В вашем коде есть несколько моментов, которые стоит учесть.
Вы создаете объект 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 с установленной временной зоной и для локальной зоны, если вам это необходимо.
Этот код действительно возвращает время в формате 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
}
Объяснение:
- В методе
getUTCdatetimeAsString()создается объектSimpleDateFormat, который форматирует текущее время, используя указанный формат и временную зону UTC. getUTCdatetimeAsDate()вызываетgetUTCdatetimeAsString()для получения времени в виде строки, а затем передает эту строку в методstringDateToDate()для преобразования в объектDate.- Метод
stringDateToDate()используетSimpleDateFormatдля преобразования строки в объектDate, и он обрабатывает возможные исключения при парсинге.
Замечания:
- Важно убедиться, что переменная
DATE_FORMATиспользуется последовательно во всех местах, где требуется формат даты. - Убедитесь, что метод
stringDateToDateобрабатывает входные данные корректно (например, проверка на null).
Ваш код на Java предназначен для получения текущего времени, определения смещения часового пояса и преобразования его в время по Гринвичу (GMT). Давайте разберем его по шагам.
Вы создаете экземпляр класса
Calendar, чтобы получить текущее время:Calendar c = Calendar.getInstance(); System.out.println("current: " + c.getTime());Получаете текущий часовой пояс и его смещение от GMT:
TimeZone z = c.getTimeZone(); int offset = z.getRawOffset();Проверяете, действует ли переход на летнее/зимнее время, и при необходимости добавляете смещение:
if (z.inDaylightTime(new Date())) { offset = offset + z.getDSTSavings(); }Преобразуете смещение в часы и минуты:
int offsetHrs = offset / 1000 / 60 / 60; int offsetMins = offset / 1000 / 60 % 60;Выводите смещения:
System.out.println("offset: " + offsetHrs); System.out.println("offset: " + offsetMins);В конечном итоге вы корректируете текущее время, вычитая смещение:
c.add(Calendar.HOUR_OF_DAY, (-offsetHrs)); c.add(Calendar.MINUTE, (-offsetMins));И выводите время в формате GMT:
System.out.println("GMT Time: " + c.getTime());
Таким образом, ваш код правильно вычисляет текущее время в формате GMT, исходя из локального времени и заданного часового пояса. Если у вас возникли вопросы или необходима дополнительная помощь, пожалуйста, уточните!
В вашем коде действительно время остается одинаковым в любой точке Земли, но его представление может варьироваться в зависимости от выбранного часового пояса. Чтобы изменить представление времени, вам необходимо задать нужный часовой пояс для 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")); // Пример для Москвы
Таким образом, вы можете представлять одно и то же время в зависимости от вашего местоположения, что и влияет на восприятие времени.
Этот код позволяет получить миллисекунды в 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.
Почему вычитание этих двух временных меток (эпохи в миллисекундах) из 1927 года даёт странный результат?
Получить дату в текущем часовом поясе на Java
Сортировка ArrayList пользовательских объектов по свойству
Java 8 – Создание Instant из LocalDateTime с учетом часового пояса
Android: Как получить дату за 7 дней назад (одна неделя)?