Как использовать 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"

Если вы хотите распечатать на португальском языке. Вы должны пойти со вторым отпечатком.

Другие вопросы по тегам