Подтвердить что ты не робот

Форматирование даты и времени в зависимости от языка

Я новичок в разработке Java и Android, поэтому это может быть глупый вопрос, но я искал несколько дней и не могу найти решение:

Я пытаюсь выполнить вывод java.util.Date в зависимости от локали пользователя.

Поиск в StackOverflow приводит меня к следующему:

java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);

Выводится:

20/02/2011

На моем французском локализованном телефоне. Почти отлично.

Как я могу также вывести часы, минуты и секунды Date, используя локаль пользователя? Я смотрел в документации по Android, но ничего не нашел.

Большое спасибо.

4b9b3361

Ответ 2

ТЛ; др

ZonedDateTime                                   // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone). 
.now( ZoneId.of( "Asia/Kolkata" ) )             // Capture the current moment as seen in the specified time zone. Returns a 'ZonedDateTime' object.
.format(                                        // Generate text representing the value of this 'ZonedDateTime' object.
    DateTimeFormatter                           // Class controlling the generation of text representing the value of a date-time object.
    .ofLocalizedDateTime ( FormatStyle.FULL )   // Automatically localize the string representing this date-time value.
    .withLocale ( Locale.FRENCH )               // Specify the human language and cultural norms used in localizing.
)                                               // Return a 'String' object.

java.time

В коде, приведенном в Вопросе, используются старые классы даты и времени, которые в настоящее время унаследованы и которые заменены классами java.time, встроенными в Java 8 и более поздние версии.

Локаль и часовой пояс не имеют ничего общего друг с другом. Локаль определяет человеческий язык и культурные нормы, используемые при генерации строки для представления значения даты и времени. Часовой пояс определяет время настенных часов определенного региона, которое используется для представления момента на временной шкале.

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Instant instant = Instant.now();

2016-10-12T07:21:00.264Z

Примените часовой пояс, чтобы получить ZonedDateTime. Я произвольно решил показать этот момент, используя часовой пояс Индии. Тот же момент, та же точка на временной шкале.

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );

2016-10-12T12:51:00.264+05:30[Asia/Kolkata]

Генерация строки с использованием языка Квебек, Канада. Пусть java.time автоматически локализует строку.

Locale l = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( l );
String output = zdt.format ( f );  // Indian time zone with Québécois presentation/translation.

mercredi 12 octobre 2016 12 h 51 IST


О java.time

Среда java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, .Calendar и & java.text.SimpleDateFormat.

Проект Joda-Time, который теперь находится в режиме обслуживания, рекомендует выполнить переход на java.time.

Чтобы узнать больше, ознакомьтесь с Учебником по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.

Где взять классы java.time?

  • Java SE 8 и SE 9 и более поздние
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые мелкие функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и еще.

Ответ 3

java.text.DateFormat имеет все функции, которые вам могут понадобиться:

DateFormat.getDateInstance()

DateFormat.getTimeInstance()

Но то, что вам нужно, это:

DateFormat.getDateTimeInstance() Вы также можете указать длину части даты/времени и локаль. Конечный результат будет следующим:

DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, Locale.FRENCH).format(Date);

Источник: http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html

Ответ 4

DateFormat.getTimeInstance() получает формат времени со стилем форматирования по умолчанию для локали по умолчанию. Вы также можете передать стиль и Locale.

Ответ 5

public static String formatDate(Date date, boolean withTime)
{
    String result = "";
    DateFormat dateFormat;

    if (date != null)
    {
        try
        {
            String format = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT);
            if (TextUtils.isEmpty(format))
            {
                dateFormat = android.text.format.DateFormat.getDateFormat(context);
            }
            else
            {
                dateFormat = new SimpleDateFormat(format);
            }
            result = dateFormat.format(date);

            if (withTime)
            {
                dateFormat = android.text.format.DateFormat.getTimeFormat(context);
                result += " " + dateFormat.format(date);
            }
        }
        catch (Exception e)
        {
        }
    }

    return result;
}

Ответ 6

Используйте getBestDateTimePattern()

DateFormat.getBestDateTimePattern() из пакета android.text.format создает наилучшую возможную дату и время в соответствии с языковым стандартом, установленным пользователем.

Например: скелет EEEE, MMM d, YYYY, jj:mm возвращает локализованную дату и время следующим образом.

Locale English (India):            Monday 9 Sep 2019, 9:33 PM
Locale English (United States):    Monday, Sep 9, 2019, 9:33 PM
Locale español (Estados Unidos):   lunes, 9 de sep. de 2019 9:33 PM
Locale español (México):           lunes, 9 de sep de 2019 21:33
Locale français (France):          lundi 9 sept. 2019 à 21:33
Locale português (Brasil):         segunda-feira, 9 de set de 2019 21:33

и так далее для разных регионов. Он также учитывает 12-часовой или 24-часовой формат времени локали.

Для настройки собственного скелета см. шаблон UTS # 35 на unicode.org.

Пример кода

Вот проверенный пример кода в Котлине:

val skeleton = DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE, MMM d, YYYY, jj:mm")
val formatter = SimpleDateFormat(skeleton, Locale.getDefault()).apply {
    timeZone = TimeZone.getDefault()
    applyLocalizedPattern(skeleton)
}
val dateTimeText = formatter.format(calendar.time)
Log.d("YourClass", "Locale ${Locale.getDefault().displayName}: $dateTimeText")

Вместо класса Calendar вы также можете использовать ZonedDateTime. Просто преобразуйте его в объект Date и передайте его format(). Например: Date(zonedDateTime.toInstant().toEpochMilli())

Надеюсь, это поможет.

Ответ 7

Если вам нужны часы секунд и миллисекунд текущей локали, используйте Calendar.getInstance(). getTime() предоставит вам время текущей локали