【问题标题】:Android Material Date Picker Date FormatAndroid Material Date Picker 日期格式
【发布时间】:2020-08-11 13:57:21
【问题描述】:

我在我的应用中使用材料日期选择器来选择日期。下面是我的代码。

MaterialDatePicker.Builder builder = MaterialDatePicker.Builder.datePicker();
    builder.setSelection(Calendar.getInstance().getTimeInMillis());
    builder.setTitleText(getString(R.string.selectDate));
    final MaterialDatePicker materialDatePicker = builder.build();

    btn_pickDate(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            materialDatePicker.show(getSupportFragmentManager(),"DATE_PICKER");
        }
    });
    
    materialDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener() {
        @Override
        public void onPositiveButtonClick(Object selection) {
            startDate.setText(materialDatePicker.getHeaderText());
        }
    });

当我选择一个日期时,日期在设备一中的 dd MMM yyyy 和设备二中的 MMM dd, yyyy 中返回。

我需要在所有设备上以相同的格式(例如:dd MMM yyyy)返回日期。如何在材料日期选择器中实现这一点。

【问题讨论】:

    标签: java android datepicker android-datepicker material-components-android


    【解决方案1】:

    addOnPositiveButtonClickListener 侦听器将所选日期返回为 Long 值。这样你就有了一个long值而不是一个String。

    你可以使用:

        MaterialDatePicker<Long> materialDatePicker = builder.build();
        
        materialDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Long>() {
            @Override
            public void onPositiveButtonClick(Long selection) {
               //....
               Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
               calendar.setTimeInMillis(selection);
               SimpleDateFormat format = new SimpleDateFormat("yyyy MM dd");
               String formattedDate  = format.format(calendar.getTime());
            }
        });
    

    在科特林中:

    materialDatePicker.addOnPositiveButtonClickListener {
        val utc = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
        utc.timeInMillis = it
        val format = SimpleDateFormat("yyyy-MM-dd")
        val formatted: String = format.format(utc.time)        
    }
    

    【讨论】:

    • 我认为问题还在于在所有设备上一致地对其进行格式化。根据区域设置、设备的时区,Long 时间并没有太大帮助:特别是,用户应该选择一个 date 并且 API 返回一个 time,它需要相当多的处理才能得到正确的日期和格式,请参阅偏移量计算的答案。
    【解决方案2】:

    如果您想更改 MaterialPicker 日期格式,请使用以下代码,该代码对我有用。

    MaterialDatePicker<Long> materialDatePicker=materialDateBuilder.build();
    materialDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Long>() {
            @Override
            public void onPositiveButtonClick(Long selection) {
                // Get the offset from our timezone and UTC.
                TimeZone timeZoneUTC = TimeZone.getDefault();
                // It will be negative, so that's the -1
                int offsetFromUTC = timeZoneUTC.getOffset(new Date().getTime()) * -1;
                // Create a date format, then a date object with our offset
                SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
                Date date = new Date(selection + offsetFromUTC);
    
                mEt_last_date_to_apply.setText(simpleFormat.format(date));
            }
        });
    

    【讨论】:

    • 我认为这是最好的答案。在a comment on a similar Github issue 之后,我认为一些更简洁的代码是直接在 SimpleDateFormat 上设置时区:SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US); simpleFormat.setTimeZone(TimeZone.getTimeZone("UTC")); mEt_last_date_to_apply.setText(simpleFormat.format(Date(selection)));
    【解决方案3】:

    你应该使用SimpleDateFormat根据你的选择来格式化日期。

    @Override
    public void onDateSet(DatePickerDialog view, int Year, int Month, int Day) {
    
        Calendar selectedDate = Calendar.getInstance().set(Year,Month,Day);
        DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        String formatedDate = formatter.format(selectedDate );
        //to sting desired format date
        Toast.makeText(MainActivity.this, formatedDate , Toast.LENGTH_LONG).show();
    }
    

    编码愉快!

    【讨论】:

    • 你好,你的代码出现如下错误java.lang.IllegalArgumentException: Cannot format given Object as a Date
    • 我认为您的答案是针对 DatePicker Dialog 而不是 Material Date Picker。请检查我的代码。在我的代码中,materialDatePicker.getHeaderText() 将返回选定的日期。
    • 我可能滑到那里了.. 但你也可以在那里使用SimpleDateFormat ...
    • DateFormat targetFormat = new SimpleDateFormat("dd MMM yyyy"); DateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = originalFormat.parse(materialDatePicker.getHeaderText()); attn_date.setText(targetFormat.format(date)); 我们需要知道原始日期格式(即从日期选择器对话框中选择的日期)才能将日期更改为目标格式。我的问题是,原始格式因设备而异(例如:某些设备中的 MMM dd、yyyy 和某些设备中的 dd MM yyyy)。
    • 嗯嗯...new SimpleDateFormat("dd MMM yyyy") 是您要格式化的格式。你在new SimpleDateFormat("your desired format") 中提供你想要的格式,targetFormat.format(date) 会给你结果。
    【解决方案4】:

    我的解决方案:

       val builder = MaterialDatePicker.Builder.datePicker()
        builder.setTitleText("Select a Date")
        val picker = builder.build()
        tv_rw_startDate.setOnClickListener {
            picker.show(activity?.supportFragmentManager!!, picker.toString())
            picker.addOnPositiveButtonClickListener {
                val calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"))
                calendar.time = Date(it)
                tv_rw_startDate.text = "${calendar.get(Calendar.DAY_OF_MONTH)}/ " +
                        "${calendar.get(Calendar.MONTH) + 1}/${calendar.get(Calendar.YEAR)}"
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多