首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择后MaterialDatePicker返回错误的日期

选择后MaterialDatePicker返回错误的日期
EN

Stack Overflow用户
提问于 2021-10-20 14:58:05
回答 2查看 104关注 0票数 0

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

代码语言:javascript
复制
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日。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-21 13:22:18

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

代码语言:javascript
复制
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/

票数 2
EN

Stack Overflow用户

发布于 2021-10-20 15:16:12

使用:

代码语言:javascript
复制
   c1.setTimeZone(TimeZone.getTimeZone("UTC"));

而不是

代码语言:javascript
复制
   c1.setTimeZone(TimeZone.getDefault());

看看这是否有帮助:

代码语言:javascript
复制
    Calendar c1 = Calendar.getInstance(Locale.getDefault())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69648393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档