Как получить текущую дату и время в 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 года даёт странный результат?
Сортировка ArrayList пользовательских объектов по свойству
Преобразование строки в дату в Java
Как получить текущее время в формате YYYY-MM-DD HH:MI:Sec.Millisecond в Java?
Где найти документацию по форматированию даты в JavaScript?