Правильно: Answer by Loc: Ваш звонок Calendar::getTime
создает объект java.util.Date
. Класс java.util.Date
не имеет явного часового пояса, но его метод toString
путается, применяя текущий часовой пояс JVM по умолчанию при создании строки.
Все очень запутывающие имена и поведение - некоторые из причин, из-за которых следует избегать этих плохо разработанных, запутывающих и неприятных старых устаревших классов времени. Вместо этого вы должны использовать классы java.time, которые официально вытесняют старые классы.
java.time
Получить текущий момент в UTC. Класс Instant
представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now();
Вы можете создать строку для представления этого значения со стандартным ISO 8601 форматирования, вызвав toString
.
String output = instant.toString();
2016-09-28T19: 38: 21Z
Код в вопросе игнорирует вопрос о временной зоне. Если вы не укажете часовой пояс, то ваш часовой пояс JVM будет применяться неявно. Лучше указывать явно.
Обратите внимание, что Locale
и часовой пояс являются двумя совершенно отдельными выпусками.
Locale
определить (а) человеческий язык для перевода имени дня, название месяца, и такие, и (б) культурные нормы Решающие вопросы аббревиатуры, капитализация, пунктуации, и тому подобное.
- Часовой пояс определяет wall-clock time, используемый для представления даты и времени.
У вас может быть любая комбинация из двух. Например, часовой пояс Калькутты Индии с французским языком или бразильский португальский язык с часовым поясом Окленд Новой Зеландии.
Locale locale = new Locale("pt", "BR");
ZoneId z = ZoneId.of("Pacific/Auckland");
Применить временную зону в качестве ZoneId
, чтобы произвести ZonedDateTime
. Концептуально подумайте об этом как ZonedDateTime = (Instant + ZoneID)
.
Укажите proper time zone name в формате continent/region
. Никогда не используйте аббревиатуру 3-4 буквы, такую как EST
или IST
, поскольку они не являются настоящими часовыми поясами, а не стандартизированы и даже не уникальны (!).
ZonedDateTime zdt = instant.atZone(z);
The Locale
не влияет на смысл, на презентации. Мы можем позволить объекту Locale
управлять автоматической локализацией при создании строки, чтобы представить значение даты-времени через класс DateTimeFormatter
. Укажите FormatStyle
, чтобы определить, как долго или сокращенно должна быть строка.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
.withLocale(locale);
String output = zdt.format(f);
Дамп для консоли. Изображенные здесь объекты instant
и zdt
представляют тот же момент, тот же момент на шкале времени. Единственное различие - это просмотр через линзу времени настенного времени другого региона.
System.out.println ("instant.toString(): " + instant
+ " | zdt: " + zdt
+ " | output: " + output);
instant.toString(): 2016-09-28T20: 20: 38.242Z | zdt: 2016-09-29T09: 20: 38.242 + 13: 00 [Pacific/Auckland] | выход: Quinta-Feira, 29 де Setembro де 2016 09h20min38s NZDT
Конверсия
Избегайте старых .Date
и .Calendar
классы. Но если вы должны использовать их со старым кодом, еще не обновленным для типов java.time, вы можете конвертировать.Используйте новые методы, добавленные к старым классам. Здесь мы называем java.util.GregorianCalendar.from(ZonedDateTime)
.
java.util.Calendar cal = java.util.GregorianCalendar.from(zdt) ;
И, отправляясь в другую сторону:
ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые классы времени, такие как java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений.
Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport и дополнительно выполнен с возможностью Android в ThreeTenABP (см How to use…).
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
Я не уверен, если вы выполните вопрос ... То, что вы говорите, очевидно. Вопрос в том, что я делаю неправильно, так как я использовал getInstance (Locale l), и в документации говорилось другое. –
Calendar.getInstance (local) - это просто возвращаемый экземпляр календаря, но когда Java выполняет c.getTime(). ToString() ---> Java не использует португальский язык для выполнения toString() – Loc
, если 'c.getTime() .toString() 'не использовать Календарь с' Locale ("pt", "BR") ', какие методы используют этот' Locale', и какова цель 'getInstance (Locale)', если 'getTime 'Dont использовать его? –