2015-04-29 2 views
2

Я пытаюсь использовать Calendar.getInstance(Locale l) с указанным Locale и не работает. Я не могу понять, что я делаю неправильно.Как использовать Calendar.getInstance с указанным Locale

Документ Java Doc. говорят:

деЫпзЬапс общественный статический календарь деЫпзЬапс (Locale aLocale) Получает календарь, используя часовой пояс по умолчанию и указанные региональные настройки. Возвращенный календарь основан на текущем времени в часовом поясе по умолчанию с данным языком. Параметры: aLocale - местонахождение для данных недели Возврат: a Календарь.

Мой код:

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 должен b e в Locale("pt", "BR"), на португальском?

ответ

3

Правильно: 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.

2

Ваш первый печать Дата информация только для печати & Java с использованием локали по умолчанию для этой печати (на английском языке)

System.out.println(c.getTime()); 

Эта печать будет выполнять:. C.getTime() ToString() метод, и этот метод с использованием Язык по умолчанию (АНГЛИЙСКИЙ). Вы можете посмотреть исходный код Date.toString(), чтобы увидеть Java, использующий языковой стандарт по умолчанию.

Именно поэтому выход «ср 29 апреля 10:18:16 BRT 2015»

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

+1

Я не уверен, если вы выполните вопрос ... То, что вы говорите, очевидно. Вопрос в том, что я делаю неправильно, так как я использовал getInstance (Locale l), и в документации говорилось другое. –

+0

Calendar.getInstance (local) - это просто возвращаемый экземпляр календаря, но когда Java выполняет c.getTime(). ToString() ---> Java не использует португальский язык для выполнения toString() – Loc

+0

, если 'c.getTime() .toString() 'не использовать Календарь с' Locale ("pt", "BR") ', какие методы используют этот' Locale', и какова цель 'getInstance (Locale)', если 'getTime 'Dont использовать его? –

Смежные вопросы