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

Форматирование даты на основе пользовательской локали на Android

Я хочу отобразить дату рождения в зависимости от локали пользователя. В моем приложении одно из моих полей - это дата рождения, которая в настоящее время имеет формат dd/mm/yyyy. Поэтому, если пользователь меняет свою локаль, формат даты также должен измениться. Любые указатели или примеры кода действительно помогут мне преодолеть проблему.

4b9b3361

Ответ 1

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

Пример:

String dateOfBirth = "26/02/1974";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
    date = sdf.parse(dateOfBirth);
} catch (ParseException e) {
    // handle exception here !
}
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context);
String s = dateFormat.format(date);

Вы можете использовать различные методы getLongDateFormat, getMediumDateFormat в зависимости от уровня детализации, который вы хотели бы иметь.

Ответ 2

Чтобы изменить формат даты в соответствии с языковой версией, для меня работал следующий код:

    String dateOfBirth = "26/02/1974";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date date = null;
    try {
        date = sdf.parse(dateOfBirth);
    } catch (ParseException e) {
        // handle exception here !
    }

    String myString = DateFormat.getDateInstance(DateFormat.SHORT).format(date);

Затем, когда вы меняете язык, формат даты будет изменяться на основе этого. Для получения дополнительной информации о шаблонах дат: http://docs.oracle.com/javase/tutorial/i18n/format/dateFormat.html

Ответ 3

Android API обеспечивает простой способ отображения локализованного формата даты. Следующий код работает.

public class FileDateUtil {
    public static String getModifiedDate(long modified) {
        return getModifiedDate(Locale.getDefault(), modified);
    }

    public static String getModifiedDate(Locale locale, long modified) {
        SimpleDateFormat dateFormat = null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            dateFormat = new SimpleDateFormat(getDateFormat(locale));
        } else {
            dateFormat = new SimpleDateFormat("MMM/dd/yyyy hh:mm:ss aa");
        }

        return dateFormat.format(new Date(modified));
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static String getDateFormat(Locale locale) {
        return DateFormat.getBestDateTimePattern(locale, "MM/dd/yyyy hh:mm:ss aa");
    }
}

Вы можете проверить следующий код.

String koreaData = FileDateUtil.getModifiedDate(Locale.KOREA, System.currentTimeMillis());
String franceData = FileDateUtil.getModifiedDate(Locale.FRENCH, System.currentTimeMillis());
String defaultData = FileDateUtil.getModifiedDate(Locale.getDefault(), System.currentTimeMillis());

String result = "Korea : " + koreaData + System.getProperty("line.separator");
result += "France : " + franceData + System.getProperty("line.separator");
result += "Default : " + defaultData + System.getProperty("line.separator"); 
tv.setText(result);

Ответ 4

Так просто как

Для даты + время:

DateFormat format = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault());

Для всего свидания:

DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());

Ответ 5

Чтобы получить шаблон формата даты, вы можете сделать:

Format dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
String pattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();

После этого вы можете отформатировать ваш ввод в соответствии с шаблоном.

Ответ 6

Хотя принятый ответ был правильным, когда вопрос был задан, он позже устарел. Я помогаю современным ответом.

java.time и ThreeTenABP

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);

    LocalDate dateOfBirth = LocalDate.of(1991, Month.OCTOBER, 13);
    String formattedDob = dateOfBirth.format(dateFormatter);
    System.out.println("Born: " + formattedDob);

Это дает различный вывод в зависимости от настроек локали JVM (обычно берется с устройства). Например:

  • Канадский французский: Born: 91-10-13
  • Китайский: Born: 1991/10/13
  • Немец: Born: 13.10.91
  • Итальянский язык: Born: 13/10/91

Если вы хотите более длинный формат, вы можете указать другой стиль формата. Пример выходных данных в английской локали США:

  • FormatStyle.SHORT: Born: 10/13/91
  • FormatStyle.MEDIUM: Born: Oct 13, 1991
  • FormatStyle.LONG: Born: October 13, 1991
  • FormatStyle.FULL: Born: Thursday, October 13, 1991

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android. Это просто требует как минимум Java 6.

  • В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26) встроен современный API.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старом) Android используйте Android-версию ThreeTen Backport. Его называют ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Вопрос: Могу ли я также принять пользовательский ввод в локальном формате?

Да, ты можешь. Форматтер также можно использовать для анализа строки пользователя в LocalDate:

    LocalDate date = LocalDate.parse(userInputString, dateFormatter);

Я предлагаю вам сначала отформатировать примерную дату и показать ее пользователю, чтобы он/она мог видеть, какой формат ваша программа ожидает для его/ее локали. В качестве примера в качестве даты возьмем дату с днем месяца, превышающим 12, и годом, превышающим 31, чтобы в примере можно было видеть порядок дня, месяца и года (для более длинных форматов год не имеет значения, поскольку он будет состоять из четырех цифр).

При анализе будет возникать DateTimeParseException если пользователь ввел дату в неправильном формате или в недопустимой дате. Поймай это и позволь пользователю попробовать еще раз.

Вопрос: Могу ли я сделать то же самое со временем дня? Дата и время?

Да. Для форматирования времени суток в соответствии с языковым стандартом пользователя получите средство форматирования из DateTimeFormatter.ofLocalizedTime. Для даты и времени используйте одну из перегруженных версий DateTimeFormatter.ofLocalizedDateTime.

Избегайте классов DateFormat, SImpleDateFormat и Date

Я рекомендую вам не использовать DateFormat, SimpleDateFormat и Date. Эти классы плохо разработаны и давно устарели, первые два особенно печально известны. Вместо этого используйте LocalDate, DateTimeFormatter и другие классы из java.time, современного Java-API даты и времени.

связи