Как получить полный формат даты из строки «Октябрь» и целочисленного значения «2018» в полный формат даты? - PullRequest
0 голосов
/ 17 декабря 2018

Я использую настраиваемое средство выбора номера в своем приложении, чтобы получить месяц и год в качестве ввода от пользователя.При выборе Месяца в палитре чисел значение месяца должно быть сохранено как строка, а год - как целое число.Поэтому я просто хочу получить полный формат даты из имени месяца в строке и значения целого года.

Это мой заказчик месяца.

    final Dialog d = new Dialog ( getContext ( ) );
    d.setContentView ( R.layout.dialog );
    final NumberPicker monthNp = (NumberPicker) d.findViewById ( R.id.monthPicker );
    final NumberPicker yearNp = (NumberPicker) d.findViewById ( R.id.yearPicker );
    Button okDialog = (Button) d.findViewById ( R.id.ok_dialog );
    Button cancelDialog = (Button) d.findViewById ( R.id.cancel_dialog );
    monthNp.setMinValue ( 0 );
    monthNp.setMaxValue ( monthArray.length - 1 );
    monthNp.setDisplayedValues ( monthArray );
    monthNp.setWrapSelectorWheel ( false );
    monthNp.setValue ( imonth );
    monthNp.setOnValueChangedListener ( new NumberPicker.OnValueChangeListener ( ) {
        @Override
        public void onValueChange ( NumberPicker picker, int oldVal, int newVal ) {
            if ( oldVal != 0 ) {
                changed = 1;
                String  getMonthFromNp = monthArray[newVal];
            }
        }
    } );
}
if ( yearNp != null ) {
    yearNp.setMinValue ( year - 15 );
    yearNp.setMaxValue ( year );
    yearNp.setValue ( year );
    yearNp.setWrapSelectorWheel ( false );
    yearNp.setOnValueChangedListener ( new
            NumberPicker.OnValueChangeListener ( ) {
        @Override
        public void onValueChange ( NumberPicker picker, int oldVal,
                int newVal ) {
            if ( oldVal != 0 ) {
                changed = 1;
                int  getYearFromNp = yearNp.getValue ( );
            }
        }
    } );

    try{
        SimpleDateFormat monthFromNP = new SimpleDateFormat ( "MMMM" );
        Date month = monthFromNP.parse( getMonthFromNp );
        calendar = Calendar.getInstance ( );
        calendar.setTime ( month );
        calendar.set ( Calendar.YEAR, getYearFromNp );
        calendar.set ( Calendar.MONTH, +1 );
        calendar.set ( Calendar.DAY_OF_MONTH, 0 );
        calendar.set ( Calendar.DATE,
                calendar.getActualMinimum ( Calendar.DAY_OF_MONTH ) );
        calendar.set ( Calendar.HOUR_OF_DAY, 0 );
        calendar.set ( Calendar.MINUTE, 0 );
        calendar.set ( Calendar.SECOND, 0 );
        calendar.set ( Calendar.MILLISECOND, 0 );
        startDate = calendar.getTime ( );
        calendar.set ( Calendar.DATE,
                calendar.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
        calendar.set ( Calendar.HOUR_OF_DAY, 23 );
        calendar.set ( Calendar.MINUTE, 59 );
        calendar.set ( Calendar.SECOND, 59 );
        calendar.set ( Calendar.MILLISECOND, 999 );
        endDate = calendar.getTime ( );
    } 
    catch ( ParseException e ) {
        e.printStackTrace ( );
    }

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

java.time

    int monthVal = 9; // 0-based index, so 9 means October
    int yearVal = 2018;

    YearMonth ym = YearMonth.of(yearVal, Month.values()[monthVal]);
    System.out.println("Year and month selected: " + ym);

Выходные данные из этого фрагмента:

Выбранные год и месяц: 2018-10

Кажется изВаш код, который вам нужен, начало и конец интервала, составляющего выбранный месяц.Если это может сработать для вас, я предлагаю вам получить интервал полуоткрытый , то есть от начальной даты включительно до конечной даты эксклюзивной .Это избавляет вас от странностей установки времени 23: 59: 59,999 и так далее.В этом простом фрагменте я устанавливаю только даты, поскольку этого действительно достаточно для представления интервала:

    LocalDate startDateInclusive = ym.atDay(1);
    LocalDate endDateExclusive = ym.plusMonths(1).atDay(1);
    System.out.println("From " + startDateInclusive + " inclusive to "
            + endDateExclusive + " exclusive");

С 2018-10-01 включительно до 2018-11-01 эксклюзивно

Если вам нужны устаревшие Date объекты для какого-либо устаревшего API, который вы не можете изменить прямо сейчас:

    Instant startInstantInclusive = startDateInclusive
            .atStartOfDay(ZoneId.systemDefault())
            .toInstant();
    Date oldfashionedDate = DateTimeUtils.toDate(startInstantInclusive);
    System.out.println("As old-fashioned Date: " + oldfashionedDate);

На моем компьютере в часовом поясе Европы / Копенгагена я получил:

Как старомодно Дата: Пн. 01 01 00:00:00 CEST 2018

Аналогично для даты окончания.

Вопрос: Могу ли я использовать Java.time на Android?

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

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

Ссылки

0 голосов
/ 17 декабря 2018

Попробуйте этот подход:

    int year = 2018;
    String month = "October";
    String str = month +" "+ year;

    SimpleDateFormat sdf = new SimpleDateFormat("MMMM yyyy");
    Date date = sdf.parse(str);
...