В настоящее время я работаю над созданием пользовательского формата даты, который должен отображаться как «Понедельник, 8 апреля 2019 г.». но всякий раз, когда я выбираю из диалогового окна и применяю простой формат даты, он возвращает дату с сокращенным месяцем и временем (что мне не нужно). есть идеи, как я могу обновить свой код, чтобы заставить его работать в указанном выше формате? Вот мой код:
@Override
public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
String date = (++monthOfYear)+" "+dayOfMonth+", "+year;
SimpleDateFormat dateFormat = new SimpleDateFormat("E MMM dd yyyy");
dateFormat.format(new Date());
Date convertedDate = new Date();
try {
convertedDate = dateFormat.parse(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myDate.setText(convertedDate.toString());
}
В качестве отступления подумайте о том, чтобы отказаться от давно устаревших и заведомо неприятных SimpleDateFormat
и друзей и добавить тридесятьABP в свой проект Android, чтобы использовать java.time
, современный API даты и времени Java. С ним намного приятнее работать.
Возможный дубликат отображать Java.util.Date в определенном формате
Или возможный дубликат Изменить формат даты календаря DatePickerDialog в Android
Чтобы получить такой формат: Monday, April 8, 2019
вы должны отформатировать дату следующим образом: (источник):
SimpleDateFormat mDateFormat = new SimpleDateFormat("EEEE, MMMMM dd, yyyy");
myDate.setText(mDateFormat.format(convertedDate));
Удачи
Я бы сделал что-то вроде этого:
@Override
public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
Calendar mDate = Calendar.getInstance();
mDate.set(year, monthOfYear, dayOfMonth);
SimpleDateFormat mDateFormat = new SimpleDateFormat("EEEE, MMMMM dd, yyyy");
myDate.setText(mDateFormat.format(mDate.getTime()));
}
похоже, это не работает. В моем коде я просто заменяю строку на предложенную вами «SimpleDateFormat mDateFormat = new SimpleDateFormat («EEEE, MMMMM dd, yyyy»); «но это ломает ее в том смысле, что вместо этого показывает только сегодняшнюю дату выбранной даты. Также mydate settext ожидает строку, поэтому происходит сбой для myDate.setText(mDateFormat.format(convertedDate)); есть идеи, что может быть не так?
я использовал ваш подход, и он разбился с E/AndroidRuntime: FATAL EXCEPTION: main Process: com.myapp, PID: 28523 java.lang.IllegalArgumentException: невозможно отформатировать данный объект как дату в java.text.DateFormat.format(DateFormat.java :306) в java.text.Format.format(Format.java:157) в com.ui.registervisitor.RegisterVisitorFragment.onDateSet в строке myDate
что-то странное происходит с приведенным выше кодом для функции onDateSet. Он показывает правильный формат и правильный день и год, но показывает неправильный день недели (EEEE) и неправильный месяц (MMMM). Это на самом деле показывает мне месяц за май, даже если я выберу апрель, и показывает мне субботу, когда это вторник.
на самом деле приведенный выше код работает с отсутствующей строкой: mDateFormat.parse(date); что сделало его идеальным! Спасибо! также простой шаблон формата даты, который я использовал, чтобы заставить его работать: «EEE, MMMM d, yyyy»
DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)
.withLocale(Locale.US);
LocalDate date = LocalDate.of(year, ++monthOfYear, dayOfMonth);
String formattedDate = date.format(dateFormatter);
Monday, April 8, 2019
Не утруждайте себя определением собственного формата даты с помощью строки шаблона формата. Нужный формат уже встроен.
Я использую java.time, современный API даты и времени Java. Кластеры даты/времени, которые вы пытались использовать, SimpleDateFormat
и Date
, давно устарели и плохо спроектированы, первый, в частности, заведомо проблематичен, поэтому я не хотел их использовать.
Да, java.time отлично работает на старых и новых устройствах Android. Просто требуется как минимум Ява 6.
org.threeten.bp
с подпакетами.year
, monthOfYear
и dayOfMonth
в строку, которую пытаетесь разобрать, что является обходным путем, но, что еще хуже, строка не имеет формата E MMM dd yyyy
, поэтому разбор ее вашим SimpleDateFormat
, вероятно, не удался. Если вы не видели трассировку стека из e.printStackTrace();
, я предполагаю, что у вас есть серьезная проблема в настройке вашего проекта, которую вы должны исправить, прежде чем писать другую строку кода. Если вы не видите ошибок, возникающих в вашем коде, вы программируете с завязанными глазами. Ошибка синтаксического анализа привела к тому, что вместо этого отображалась текущая дата, полученная из new Date()
.convertedDate.toString()
возвращает строку в формате EEE MMM dd HH:mm:ss zzz yyyy
для отображения. Например Tue Apr 09 09:39:47 EDT 2019
. Date.toString
всегда возвращает этот формат. Это не имеет ничего общего с форматом, из которого была проанализирована дата (даже если она была успешно проанализирована), поскольку Date
— это просто момент времени, в нем не может быть формата.java.time
.java.time
на Java 6 и 7 (ThreeTen для JSR-310).
лично я предпочитаю создавать свои собственные даты, используя мои собственные месяцы, либо сокращенные, либо не создавать getMonthFromInt(dayOfMonth)