【问题标题】:How to get full Date format from String "October" and from integer value "2018" into full date format?如何从字符串“October”和整数值“2018”获取完整日期格式为完整日期格式?
【发布时间】:2018-12-17 12:56:07
【问题描述】:

我在我的应用程序中使用自定义的数字选择器来获取月份和年份作为用户的输入。通过在数字选择器中选择月份,月份值应保存为字符串,年份应保存为整数值。所以我只想从字符串月份名称和整数年份值中获取完整的日期格式。

This is my customized month picker.

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

【问题讨论】:

  • 请添加所有相关代码,而不仅仅是一张照片
  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
  • 你不能从你的选择器中得到(月份)数字而不是字符串吗?对我来说似乎更容易。出于好奇而不了解 Android GUI 编程。
  • 是的,我将月份作为字符串数组传递,因此在数字选择器中选择月份时,它将在 newVal=>9 中返回整数,因此我将字符串数组的 newVal 传递为月份 [9 ] 它将给出字符串数组值“October”。即使我将月份作为整数格式,如何将其转换为日期格式。

标签: android android-number-picker


【解决方案1】:

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

这个 sn-p 的输出是:

选择的年份和月份:2018-10

从您的代码看来,您需要包含所选月份的间隔的开始和结束。如果它对你有用,我建议你获得 半开 间隔,即从开始日期(含)到结束日期,不包括。这样可以省去将时间设置为 23:59:59.999 等的麻烦。在这个简单的 sn-p 中,我只设置日期,因为这确实足以表示间隔:

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

在我位于欧洲/哥本哈根时区的计算机上,我得到了:

作为老式日期:Mon Oct 01 00:00:00 CEST 2018

对结束日期执行类似操作。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。在这种情况下,请仅使用 Date oldfashionedDate = Date.from(startInstantInclusive)Instant 协调到 Date
  • 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

  • 感谢您的回复,我对我的应用程序还有疑问。我将每天将数据存储到 Firebase Firestore。如果用户想使用自定义的月份和年份选择器(主要问题中提供的屏幕截图)来检索这些数据,请单击年份下方的“全部”复选框并将月份选择为“六月”。那么如何查询所有年份的六月月份的数据呢?。
  • @SathishV.A 我认为这是一个新问题,您应该将其作为一个新问题提出。我也不确定这个问题中是否有足够的信息来回答它。
【解决方案2】:

试试这个方法:

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

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

【讨论】:

  • 这些麻烦的类在几年前被 java.time 类所取代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2016-03-05
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多