Как использовать Calendar.getInstance с указанным языковым стандартом
Я пытаюсь использовать Calendar.getInstance(Locale l)
с указанным Locale
и не работает. Я не могу понять, что я делаю неправильно.
Документ Java. сказать:
getInstance public static Calendar getInstance (Locale aLocale) Получает календарь, используя часовой пояс по умолчанию и указанный языковой стандарт. Календарь возвращается на основе текущего времени в часовом поясе по умолчанию с заданным языковым стандартом. Параметры: aLocale - локаль для данных недели. Возвращает: календарь.
Мой код:
public static void main (String[] args){
Locale local = new Locale("pt", "BR");
Calendar c = Calendar.getInstance(local); // here I am using the method
System.out.println(c.getTime()); // and here, I cannot figure out why is not working
DateFormat dt = DateFormat.getDateInstance(DateFormat.LONG, local);
String s = dt.format(c.getTime());
System.out.println(s); // here just a example in portuguese Brasil
}
Выход:
Ср 29 Апр 10:18:16 BRT 2015
29 апреля 2015 года
Если первый print
должен быть в Locale("pt", "BR")
, на португальском?
2 ответа
Ответ от Loc правильный: Ваш звонок Calendar::getTime
производит java.util.Date
объект. java.util.Date
класс не имеет явного часового пояса, но его toString
метод смущает применение текущего часового пояса JVM по умолчанию при генерации строки.
Все очень запутанные имена и поведение - некоторые из многих причин, чтобы избежать этих плохо спроектированных, запутанных и хлопотных старых устаревших классов даты и времени. Вместо этого вы должны использовать классы java.time, которые официально вытесняют старые классы.
java.time
Получить текущий момент в UTC. Instant
класс представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now();
Вы можете создать строку для представления этого значения в стандартном форматировании ISO 8601, вызвав toString
,
String output = instant.toString();
2016-09-28T19:38:21Z
Код в вопросе игнорирует проблему часового пояса. Если вы не укажете часовой пояс, текущий часовой пояс вашего JVM будет применен неявно. Лучше указать явно.
Обратите внимание, что Locale
и часовой пояс - это две совершенно разные проблемы.
Locale
определить (а) человеческий язык для перевода названия дня, названия месяца и т. д. и (б) культурных норм, решающих вопросы сокращения, капитализации, пунктуации и т. п.- Часовой пояс определяет время настенных часов, используемое для представления значения даты и времени.
Вы можете иметь любую комбинацию из двух. Например, часовой пояс Калькутта, Индия с французским языком, или бразильский португальский язык с часовым поясом Окленда, Новая Зеландия.
Locale locale = new Locale("pt", "BR");
ZoneId z = ZoneId.of( "Pacific/Auckland" );
Применить часовой пояс как ZoneId
производить ZonedDateTime
, Концептуально, думать об этом как ZonedDateTime = ( Instant + ZoneID )
,
Укажите правильное название часового пояса в формате continent/region
, Никогда не используйте 3-4 буквенное сокращение, такое как EST
или же IST
поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).
ZonedDateTime zdt = instant.atZone( z );
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 [Тихий океан / Окленд] | выходной: Quinta-feira, 29 декабря 2016 г., 09 ч. 20 мин., 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, находящийся сейчас в режиме обслуживания, рекомендует перейти на java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений.
Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать…).
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.
Ваша первая распечатка - просто распечатка информации о дате и Java с использованием локали по умолчанию для этой распечатки (английский)
System.out.println(c.getTime());
Эта печать будет выполнять: метод c.getTime (). ToString (), и этот метод с использованием локали по умолчанию (АНГЛИЙСКИЙ). Вы можете взглянуть на исходный код Date.toString (), чтобы увидеть Java с использованием локали по умолчанию.
Вот почему вывод: "Ср 29 Апр 10:18:16 BRT 2015"
Если вы хотите распечатать на португальском языке. Вы должны пойти со вторым отпечатком.