【问题标题】:MaterialDatePicker returns incorrect date after selectionMaterialDatePicker 选择后返回不正确的日期
【发布时间】:2021-12-07 10:00:12
【问题描述】:

由于某种未知原因,MaterialDatePicker 在选择后返回不正确的日期。 例如,用户位于墨西哥地区,时区为:America/Tijuana。当他在视觉表示中选择:2021-10-05 时,在结果文本中我有 -1 天,2021-10-04。对于 RU 地区,一切正常。代码如下:

public void startDateSelectionPicker() {
    try {
        MaterialDatePicker<Long> picker = MaterialDatePicker.Builder.datePicker()
                .setSelection(MaterialDatePicker.todayInUtcMilliseconds())
                .setTheme(R.style.CustomDatePickerDialog)
                .build();

        picker.addOnPositiveButtonClickListener(selection -> {
            TimeZone t = TimeZone.getDefault();
            Calendar c1 = Calendar.getInstance();
            c1.setTimeInMillis(selection);
            c1.setTimeZone(TimeZone.getDefault());

//here I need to receive correct date, but receiving -1 from originally selected date.

            String date = ToolsManager.calendarToDate(this, c1, "yyyy-MM-dd");
        });
        picker.show(getSupportFragmentManager(), picker.getTag());
    } catch (IllegalArgumentException e) {
    }
}

public static String calendarToDate(Context context, Calendar calendar, String dateFormat) {
        if (calendar == null) {
            return null;
        }

        Locale locale = context.getResources().getConfiguration().locale;
        DateFormat df = new SimpleDateFormat(dateFormat, locale);

        return df.format(calendar.getTime());
    }

当我设置时:.setSelection(MaterialDatePicker.todayInUtcMilliseconds())

它在日历上显示 10 月 18 日,但实际上今天是 10 月 20 日。

【问题讨论】:

    标签: android timezone java-time android-calendar materialdatepicker


    【解决方案1】:

    用途:

       c1.setTimeZone(TimeZone.getTimeZone("UTC"));
    

    而不是

       c1.setTimeZone(TimeZone.getDefault());
    

    看看这是否有帮助:

        Calendar c1 = Calendar.getInstance(Locale.getDefault())
    

    【讨论】:

    • 谢谢,但没有帮助。仍然返回 -1 天的价值
    • 试试这个它可能会工作 Calendar c1 = Calendar.getInstance(Locale.getDefault()) 而不是 Calendar c1 = Calendar.getInstance();
    • 您的回答很有帮助,但并没有完全解决我的问题,所以我 +1,谢谢,但在下面我发布了完整的工作示例,其中包含指向官方文档和示例的链接图书馆。
    • 下次请多解释一下,以便以后看到这种情况的人明白为什么会发生这种情况
    【解决方案2】:

    我已经用这样的代码解决了这个问题:

    public void startDateSelectionPicker() {
            try {
                MaterialDatePicker<Long> picker = MaterialDatePicker.Builder.datePicker()
                        .setSelection(MaterialDatePicker.todayInUtcMilliseconds())
                        .setTheme(R.style.CustomDatePickerDialog)
                        .build();
    
                picker.addOnPositiveButtonClickListener(selection -> {
                    Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
                    utc.setTimeInMillis(selection);
                    String date = ToolsManager.calendarToDate(this, utc, ToolsManager.LETY_FILTRATION_DATE_FORMAT);
                    binding.textview.setText(date);
                });
                picker.show(getSupportFragmentManager(), picker.getTag());
            } catch (IllegalArgumentException e) {
            }
        }
    
    public static String calendarToDate(Context context, Calendar calendar, String dateFormat) {
            if (calendar == null) {
                return null;
            }
    
            Locale locale = context.getResources().getConfiguration().locale;
            DateFormat df = new SimpleDateFormat(dateFormat, locale);
            TimeZone timeZone = TimeZone.getTimeZone("UTC");
            df.setTimeZone(timeZone);
    
            Date d = calendar.getTime();
            return df.format(d);
        }
    

    因此,核心求解器是使用 UTC 时区创建日历(因为它仅适用于 UTC 值,并且在格式化时我还必须初始化 UTC 时区,在其他情况下,它会根据时区将值移动几个小时。

    这两个链接也有助于理解: https://github.com/material-components/material-components-android/blob/00dc4c6b5af3939418f1c7d1e4c737dc3fb7fd67/docs/components/Picker.md#timezones

    https://github.com/material-components/material-components-android/tree/master/catalog/java/io/material/catalog/datepicker

    和转换器:https://www.epochconverter.com/

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2015-12-14
      相关资源
      最近更新 更多