Ответ 1
Используйте android.text.format.DateFormat.getTimeFormat()
ref: http://developer.android.com/reference/android/text/format/DateFormat.html
Я новичок в разработке Java и Android, поэтому это может быть глупый вопрос, но я искал несколько дней и не могу найти решение:
Я пытаюсь выполнить вывод java.util.Date
в зависимости от локали пользователя.
Поиск в StackOverflow приводит меня к следующему:
java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);
Выводится:
20/02/2011
На моем французском локализованном телефоне. Почти отлично.
Как я могу также вывести часы, минуты и секунды Date
, используя локаль пользователя? Я смотрел в документации по Android, но ничего не нашел.
Большое спасибо.
Используйте android.text.format.DateFormat.getTimeFormat()
ref: http://developer.android.com/reference/android/text/format/DateFormat.html
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 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 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, .Calendar
и & java.text.SimpleDateFormat
.
Проект Joda-Time, который теперь находится в режиме обслуживания, рекомендует выполнить переход на java.time.
Чтобы узнать больше, ознакомьтесь с Учебником по Oracle. И поищите в Кару множество примеров и объяснений. Спецификация: JSR 310.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и еще.
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
DateFormat.getTimeInstance()
получает формат времени со стилем форматирования по умолчанию для локали по умолчанию. Вы также можете передать стиль и Locale
.
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;
}
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())
Надеюсь, это поможет.
Если вам нужны часы секунд и миллисекунд текущей локали, используйте Calendar.getInstance(). getTime() предоставит вам время текущей локали