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

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

лично я предпочитаю создавать свои собственные даты, используя мои собственные месяцы, либо сокращенные, либо не создавать getMonthFromInt(dayOfMonth)

Master Fathi 08.04.2019 18:08

В качестве отступления подумайте о том, чтобы отказаться от давно устаревших и заведомо неприятных SimpleDateFormat и друзей и добавить тридесятьABP в свой проект Android, чтобы использовать java.time, современный API даты и времени Java. С ним намного приятнее работать.

Ole V.V. 09.04.2019 07:18

Возможный дубликат отображать Java.util.Date в определенном формате

Ole V.V. 09.04.2019 07:22

Или возможный дубликат Изменить формат даты календаря DatePickerDialog в Android

Ole V.V. 09.04.2019 08:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы получить такой формат: 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)); есть идеи, что может быть не так?

user2386226 08.04.2019 17:45

я использовал ваш подход, и он разбился с 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

user2386226 08.04.2019 18:35

что-то странное происходит с приведенным выше кодом для функции onDateSet. Он показывает правильный формат и правильный день и год, но показывает неправильный день недели (EEEE) и неправильный месяц (MMMM). Это на самом деле показывает мне месяц за май, даже если я выберу апрель, и показывает мне субботу, когда это вторник.

user2386226 09.04.2019 16:24

на самом деле приведенный выше код работает с отсутствующей строкой: mDateFormat.parse(date); что сделало его идеальным! Спасибо! также простой шаблон формата даты, который я использовал, чтобы заставить его работать: «EEE, MMMM d, yyyy»

user2386226 09.04.2019 17:02

java.time и ThreeTenABP

    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?

Да, java.time отлично работает на старых и новых устройствах Android. Просто требуется как минимум Ява 6.

  • В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26) современный API встроен.
  • В Java 6 и 7 используйте ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На (старом) Android используйте версию ThreeTen Backport для Android. Он называется 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 — это просто момент времени, в нем не может быть формата.

Ссылки

Другие вопросы по теме