Как мне преобразовать мою строку даты в пользовательский формат даты?

1

В настоящее время я работаю над созданием пользовательского формата даты, который должен отображаться как "Понедельник, 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());
    }
Теги:
android-fragments
date-formatting
android-datepicker
android-date

2 ответа

0

java.time и ThreeTenABP

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)
            .withLocale(Locale.US);
    LocalDate date = LocalDate.of(year, ++monthOfYear, dayOfMonth);
    String formattedDate = date.format(dateFormatter);

Я использую java.time, современный API даты и времени Java. Предложения Date/Time, которые вы пытались использовать, SimpleDateFormat и Date, давно устарели и плохо разработаны, первые, в частности, заведомо хлопотны, поэтому я не хотел их использовать.

Понедельник, 8 апреля 2019 г.

Вопрос: Могу ли я использовать 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 с подпакетами.

Что пошло не так в вашем коде?

  • Во-первых, вы собираете входящий 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 - это просто момент времени, в нем не может быть формата.

связи

0

Чтобы добиться такого формата: 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()));
}
  • 0
    это, похоже, не работает, в моем коде я просто заменяю строку на предложенный вами «SimpleDateFormat mDateFormat = new SimpleDateFormat (« EEEE, MMMMM dd, yyyy »);», но это разбивает его в том смысле, что вместо него отображается только сегодняшняя дата выбранной даты. Также mydate settext ожидает строку, поэтому он аварийно завершает работу для myDate.setText (mDateFormat.format (convertDate)); есть идеи что может быть не так?
  • 0
    @MarissaNicholas проверь мою правку :)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню