Возвращение календаря с SimpleDateFormat - PullRequest
0 голосов
/ 22 октября 2019

Я хочу вернуть значение календаря + 14 месяцев, используя SimpleDateFormat, но получаю сообщение об ошибке ниже.

private fun bestBeforeDate(cal: Calendar = Calendar.getInstance()): String
    {
        cal.add(Calendar.MONTH, 14)
        val format1 = SimpleDateFormat("dd-MM-yyy", Locale.getDefault()).format(this)
        return getString(R.string.best_before_date) + format1.format(cal)
    }
java.lang.IllegalArgumentException: Cannot format given Object as a Date

Ответы [ 2 ]

0 голосов
/ 22 октября 2019
    import java.util.Calendar;
import java.util.TimeZone;

/**
 * Java program to add, subtract dates, month and year using Calendar in Java.
 * Apart from date, Calendar class also provide time related information and can
 * be used to add and subtract hours, minutes and seconds from time in Java.
 *
 * @author Shahzad Ali
 */
public class DateAndTimeArithmetic {

    public static void main(String args[]){

        //Java calendar in default timezone and default locale
        Calendar cal = Calendar.getInstance();
        cal.setTimeZone(TimeZone.getTimeZone("GMT"));

        System.out.println("current date: " + getDate(cal));


        //adding days into Date in Java
        cal.add(Calendar.DATE, 2);
        System.out.println("date after 2 days : " + getDate(cal));

        //subtracting days from Date in Java
        cal.add(Calendar.DATE, -2);
        System.out.println("date before 2 days : " + getDate(cal));


       //adding moths into Date
        cal.add(Calendar.MONTH, 5);
        System.out.println("date after 5 months : " + getDate(cal));

        //subtracting months from Date
        cal.add(Calendar.MONTH, -5);
        System.out.println("date before 5 months : " + getDate(cal));

        //adding year into Date
        cal.add(Calendar.YEAR, 5);
        System.out.println("date after 5 years : " + getDate(cal));

        //subtracting year from Date
        cal.add(Calendar.YEAR, -5);
        System.out.println("date before 5 years : " + getDate(cal));

        //date after 200 days from now, takes care of how many days are in month
        //for years calendar takes care of leap year as well
        cal.add(Calendar.DATE, 200);
        System.out.println("date after 200 days from today : " + getDate(cal));

        System.out.println("current time in GMT: " + getTime(cal));

        //adding hours into Date
        cal.add(Calendar.HOUR_OF_DAY, 3);
        System.out.println("Time after 3 hours : " + getTime(cal));

        //subtracting hours from Date time
        cal.add(Calendar.HOUR_OF_DAY, -3);
        System.out.println("Time before 3 hours : " + getTime(cal));

        //adding minutes into Date time
        cal.add(Calendar.MINUTE, 3);
        System.out.println("Time after 3 minutes : " + getTime(cal));

        //subtracting minutes from Date time
        cal.add(Calendar.HOUR_OF_DAY, -3);
        System.out.println("Time before 3 minuets : " + getTime(cal));

    }

    /**
     *
     * @return current Date from Calendar in dd/MM/yyyy format
     * adding 1 into month because Calendar month starts from zero
     */
    public static String getDate(Calendar cal){
        return "" + cal.get(Calendar.DATE) +"/" +
                (cal.get(Calendar.MONTH)+1) + "/" + cal.get(Calendar.YEAR);
    }

    /**
     *
     * @return current Date from Calendar in HH:mm:SS format
     *
     * adding 1 into month because Calendar month starts from zero
     */
    public static String getTime(Calendar cal){
        return "" + cal.get(Calendar.HOUR_OF_DAY) +":" +
                (cal.get(Calendar.MINUTE)) + ":" + cal.get(Calendar.SECOND);
    }

}

Пример выходных данных должен быть таким: текущая дата: 22/10/2019 дата через 2 дня: 22/10/2019 дата до 2 дней: 24/10/2019 дата после5 месяцев: 22/3/2020

и т. Д.

0 голосов
/ 22 октября 2019

java.time и ThreeTenABP

Извините, я могу написать это только на Java. Пожалуйста, переведите себя. Лучше всего решить вашу задачу с помощью java.time, современного Java-API даты и времени.

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
    LocalDate date = LocalDate.now(ZoneId.of("Europe/London")).plusMonths(14);
    String result = date.format(dateFormatter);
    System.out.println("Result: " + result);

Вывод при запуске сегодня:

Результат: 22-12-2020

Исправление вашего кода

Если вы настаиваете на использовании заведомо хлопотного и давно устаревшего класса SimpleDateFormat, просто удалите .format(this) из своего кода. Бьюсь об заклад, исключение исходит оттуда, и это неправильно, поскольку у вас есть почти правильный вызов метода format в следующей строке.

private fun bestBeforeDate(cal: Calendar = Calendar.getInstance()): String
{
    cal.add(Calendar.MONTH, 14)
    val format1 = SimpleDateFormat("dd-MM-yyyy")
    return getString(R.string.best_before_date) + format1.format(cal.time)
}

Метод format ожидает либо Date(еще один плохо спроектированный и давно устаревший класс) или Long. Поскольку this не было ни одного из них, вы получили исключение.

Вопрос: Разве java.time не требует Android API уровня 26?

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

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

Ссылки

...