Как получить строку формата даты и времени из текущей локали в качестве параметра для SimpleDateFormat - PullRequest
1 голос
/ 12 января 2020

My Android приложение хочет отобразить строку даты и времени и соответствующую строку формата. Он использует SimpleDateFormat, потому что он совместим со старыми Android уровнями API.

Calendar calendar=Calendar.getInstance();
formatString=getTheCurrentLocaleDateTimeFormatString();
SimpleDateFormat dateFormat = new SimpleDateFormat(formatString);
localeTimeString= dateFormat.format(calendar.getTimeInMillis());
displayToTheUser(localeTimeString);
displayToTheUser(formatString);

, например, пользователь получает: «Ср, 4 июля 2001 12:08:56» и «EEE, d MMM гггг» ЧЧ: мм: сс "

Предоставленный фрагмент кода предназначен для получения формы даты и времени в соответствии с текущим языковым стандартом, но я не знаю, как получить ее также в виде строки формата. Он должен быть рассчитан с помощью метода getTheCurrentLocaleDateTimeFormatString (), описанного выше.

Я вижу, что доступно много шаблонов форматных строк.

Это соответствующая страница документации:

https://developer.android.com/reference/java/text/SimpleDateFormat#examples

Поскольку я хочу отобразить эту строку формата пользователю в качестве шаблона и использовать ее в качестве параметра для SimpleDateFormat, мой вопрос заключается в следующем: как получить строку формата шаблона даты и времени текущая локаль?

Ответы [ 2 ]

1 голос
/ 12 января 2020

java .time и ThreeTenABP

Код с использованием java .time. современный Java API даты и времени также может работать на старых Android API уровнях. DateTimeFormatterBuilder.getLocalizedDateTimePattern() дает вам строку шаблона формата, которую вы просили. Например:

    ZonedDateTime dateTIme = ZonedDateTime.now(ZoneId.of("America/Recife"));

    Locale userLocale = Locale.forLanguageTag("pt-BR");
    String formatPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
            FormatStyle.LONG, FormatStyle.LONG,
            IsoChronology.INSTANCE, userLocale);
    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern(formatPattern, userLocale);
    String localeTimeString = dateTIme.format(formatter);

    System.out.println(localeTimeString);
    System.out.println(formatPattern);

Только что вывод этого фрагмента был следующим:

12 de Janeiro de 2020 17h7min52s BRT
d' de 'MMMM' de 'yyyy H'h'm'min's's' z

Апострофы в шаблоне формата заключают буквальные части, поэтому de, h, min и s не считаются форматными буквами, но выводятся буквально в отформатированной дате и времени.

Вопрос: java .time не требует Android Уровень API 26?

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

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

Ссылки

1 голос
/ 12 января 2020

Вы можете сделать это следующим образом:

SimpleDateFormat getTheCurrentLocaleDateTimeFormatString() {
    return (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault());
}

Тестовая программа:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat dateFormat = getTheCurrentLocaleDateTimeFormatString();
        String localeTimeString = dateFormat.format(calendar.getTimeInMillis());
        System.out.println(localeTimeString);
    }

    static SimpleDateFormat getTheCurrentLocaleDateTimeFormatString() {
        return (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault());
    }
}

Выход:

Sunday, 12 January 2020

[Обновить]

Размещение следующего кода на основе вашего комментария:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Calendar calendar=Calendar.getInstance();
        String formatString=getTheCurrentLocaleDateTimeFormatString();
        System.out.println(formatString);
        SimpleDateFormat dateFormat = new SimpleDateFormat(formatString);
        String localeTimeString= dateFormat.format(calendar.getTimeInMillis());
        System.out.println(localeTimeString);
    }

    static String getTheCurrentLocaleDateTimeFormatString() {
        return ((SimpleDateFormat) DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault())).toLocalizedPattern();
    }
}

Вывод:

EEEE, d MMMM y
Sunday, 12 January 2020

[Другое обновление]

Размещение следующего кода на основе вашего другого комментария:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        String formatString = getTheCurrentLocaleDateTimeFormatString();
        System.out.println(formatString);
        SimpleDateFormat dateFormat = new SimpleDateFormat(formatString);
        String localeTimeString = dateFormat.format(calendar.getTimeInMillis());
        System.out.println(localeTimeString);
    }

    static String getTheCurrentLocaleDateTimeFormatString() {
        return ((SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL,
                Locale.getDefault())).toLocalizedPattern();
    }
}

Вывод:

EEEE, d MMMM y 'at' HH:mm:ss zzzz
Sunday, 12 January 2020 at 20:28:05 Greenwich Mean Time
...