簡體   English   中英

如何從字符串“ October”和整數值“ 2018”獲取完整的日期格式為完整的日期格式?

[英]How to get full Date format from String “October” and from integer value “2018” into full date format?

我在應用程序中使用自定義的號碼選擇器,以獲取月份和年份作為用戶的輸入。 通過在數字選擇器中選擇月份,月份值應另存為字符串,年份應另存為整數值。 所以我只想從字符串月份名稱和整數年份值中獲取完整的日期格式。

這是我自定義的月份選擇器。

    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 ( );
    }

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(含)

如果您需要某些舊版API的老式Date對象,但現在無法更改:

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

在歐洲/哥本哈根時區的計算機上,我得到:

老式的日期:2018年10月1日星期一CEST

對結束日期進行類似的操作。

問題:我可以在Android上使用java.time嗎?

是的,java.time在較新和較舊的Android設備上均可正常運行。 它至少需要Java 6

  • 在Java 8和更高版本以及更新的Android設備(來自API級別26)中,內置了現代API。 在這種情況下,只能使用Date oldfashionedDate = Date.from(startInstantInclusive)InstantDate進行協調。
  • 在Java 6和7中,獲取ThreeTen Backport,即新類的Backport(JSR 310的ThreeTen;請參見底部的鏈接)。
  • 在較舊的Android上,請使用Android版本的ThreeTen Backport。 它稱為ThreeTenABP。 並確保使用子包從org.threeten.bp導入日期和時間類。

鏈接

試試這種方法:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM