Java: Как вы конвертируете метку времени UTC в местное время?
75080 просмотра
3 ответа
У меня есть временная метка, которая находится в UTC, и я хочу преобразовать ее в местное время, не используя вызов API, как TimeZone.getTimeZone("PST")
. Как именно вы должны это сделать? Я использовал следующий код без особого успеха:
private static final SimpleDateFormat mSegmentStartTimeFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(mSegmentStartTimeFormatter.parse(startTime));
}
catch (ParseException e) {
e.printStackTrace();
}
return calendar.getTimeInMillis();
Пример входного значения: [2012-08-15T22:56:02.038Z]
должен вернуть эквивалент [2012-08-15T15:56:02.038Z]
Ответы (3)
54 плюса
Date
не имеет часовых поясов и магазинов внутри UTC. Только когда дата отформатирована, применяется коррекция часового пояса. Когда используется a DateFormat
, по умолчанию используется часовой пояс JVM, в которой он работает. Используйте setTimeZone
для его изменения по мере необходимости.
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");
DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
pstFormat.setTimeZone(TimeZone.getTimeZone("PST"));
System.out.println(pstFormat.format(date));
Это печатает 2012-08-15T15:56:02.038
Обратите внимание, что я пропустил 'Z'
в формате PST, поскольку это указывает на UTC. Если вы просто пошли с, Z
то результат будет2012-08-15T15:56:02.038-0700
14 плюса
Используйте современный Java date & time API, и это просто:
String inputValue = "2012-08-15T22:56:02.038Z";
Instant timestamp = Instant.parse(inputValue);
ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles"));
System.out.println(losAngelesTime);
Это печатает
2012-08-15T15:56:02.038-07:00[America/Los_Angeles]
Примечания к сведению:
- В ваших ожиданиях есть небольшая ошибка. В
Z
вашей временной метке указано UTC, также известное как зулусское время. Так что в вашем местном значении времени, тамZ
не должно быть. Скорее вы захотите получить возвращаемое значение, как, например2012-08-15T15:56:02.038-07:00
, так как смещение теперь составляет -7 часов, а не Z. - Избегайте трехбуквенных сокращений часовых поясов. Они не стандартизированы и поэтому чаще всего неоднозначны. PST, например, может означать стандартное время Philppine, стандартное тихоокеанское время или стандартное время на Питкэрне (хотя S в сокращении часто относится к летнему времени (имеется в виду летнее время)). Если вы запланировали стандартное тихоокеанское время, то это даже не часовой пояс, поскольку летом (где указывается временная метка) вместо этого используется тихоокеанское летнее время. Вместо сокращений используйте идентификаторы часовых поясов в формате регион / город, как в моем коде.
- Временные метки обычно лучше всего обрабатывать как
Instant
объекты. КонвертироватьZonedDateTime
только тогда, когда у вас есть необходимость, например, для презентации.
Вопрос: Могу ли я использовать современный API с моей версией Java?
Если вы используете хотя бы Java 6 , вы можете.
- В Java 8 и более поздних версиях новый API поставляется встроенным.
- В Java 6 и 7 получают ThreeTen Backport , бэкпорт новых классов (это ThreeTen для JSR-310, где впервые был определен современный API).
- На Android используйте Android-версию ThreeTen Backport. Он называется ThreeTenABP, и я думаю, что в этом вопросе есть замечательное объяснение : как использовать ThreeTenABP в Android Project .
-1 плюса
Вот простое модифицированное решение
public String convertToCurrentTimeZone(String Date) {
String converted_date = "";
try {
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse(Date);
DateFormat currentTFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
currentTFormat.setTimeZone(TimeZone.getTimeZone(getCurrentTimeZone()));
converted_date = currentTFormat.format(date);
}catch (Exception e){ e.printStackTrace();}
return converted_date;
}
//get the current time zone
public String getCurrentTimeZone(){
TimeZone tz = Calendar.getInstance().getTimeZone();
System.out.println(tz.getDisplayName());
return tz.getID();
}
Автор: Sathya Baman
Размещён: 08.05.2017 06:05
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- api Как получить долготу и широту для адреса улицы программно (и юридически)
- api Есть ли API-оболочка Robocopy?
- api Использование tinyurl.com в приложении .Net ... возможно?
- api Использование Windows DLL из Linux
- date Как получить разницу между двумя датами в JavaScript?
- date Получить последний день месяца в Python
- date DateTime.Now против DateTime.UtcNow
- date Получить последнюю пятницу месяца в Java
- calendar .NET: Get all Outlook calendar items
- calendar Как вычесть X дней из даты, используя календарь Java?
- calendar Как правильно проверить дату в Java
- timezone Определить часовой пояс пользователя
- timezone Обработка часовых поясов в хранилище?
- timezone Отображение даты / времени в формате локали пользователя и смещения времени
- timezone Как я могу получить текущую дату и время в UTC или GMT в Java?