Material 日期范围选择器显示不正确的当前日期 Android
Material Date Range Picker showing incorrect current date Android
Material 日期范围选择器中的当前日期显示为昨天的日期。我查看了 Material Design Picker 的源代码,它似乎在获取 UTC 时区的日期时更改了日期。当前日期是日历中圈出的日期。有什么办法可以解决这个问题吗?尽管有时区,日期范围选择器应该显示正确的日期。
该问题的一个解决方案是手动更改当前日期,我尝试查看 Datepicker 的源代码,但似乎没有找到解决此问题的方法。可以更改 Material 日期范围选择器的当前日期吗?
我将日期选择器初始化为:
MaterialDatePicker.Builder builder = MaterialDatePicker.Builder.dateRangePicker();
final MaterialDatePicker materialDatePicker = builder.build();
materialDatePicker.show(fragmentManager, materialDatePicker.toString());
请帮忙。
已在上一版本中修复:
https://github.com/material-components/material-components-android/releases/tag/1.2.0-rc01
修复了导致高亮显示为今天的错误日期的问题 ->
commit
以上问题已解决。请参考这个comment.
我已将库更新为:material:1.3.0-alpha02,它对我有帮助。
已尝试 1.4.0。工作正常
我也遇到了同样的问题。我进行了一些搜索,但看起来 material
库中存在问题。
我喜欢一些代码并解决了问题:
CalendarConstraints.Builder calendarConstraintBuilder = new CalendarConstraints.Builder();
calendarConstraintBuilder.setValidator(DateValidatorPointBackward.now());
dateBuilder = MaterialDatePicker.Builder.dateRangePicker();
dateBuilder.setTitleText("Select Date Range");
dateBuilder.setCalendarConstraints(calendarConstraintBuilder.build());
MaterialDatePicker<Pair<Long, Long>> picker = dateBuilder.build();
picker.setMenuVisibility(false);
picker.setAllowEnterTransitionOverlap(false);
picker.show(getActivity().getSupportFragmentManager(), picker.toString());
picker.addOnPositiveButtonClickListener(selection -> {
Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
utc.setTimeInMillis(selection.first);
String startDate = calendarToDate(getActivity(), utc, "dd-MMM-yyyy");
utc.setTimeInMillis(selection.second);
String endDate = calendarToDate(getActivity(), utc, "dd-MMM-yyyy");
date.setText(startDate+" to "+endDate);
});
这是calendarToDate
方法:
public 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);
}
Material 日期范围选择器中的当前日期显示为昨天的日期。我查看了 Material Design Picker 的源代码,它似乎在获取 UTC 时区的日期时更改了日期。当前日期是日历中圈出的日期。有什么办法可以解决这个问题吗?尽管有时区,日期范围选择器应该显示正确的日期。
该问题的一个解决方案是手动更改当前日期,我尝试查看 Datepicker 的源代码,但似乎没有找到解决此问题的方法。可以更改 Material 日期范围选择器的当前日期吗?
我将日期选择器初始化为:
MaterialDatePicker.Builder builder = MaterialDatePicker.Builder.dateRangePicker();
final MaterialDatePicker materialDatePicker = builder.build();
materialDatePicker.show(fragmentManager, materialDatePicker.toString());
请帮忙。
已在上一版本中修复:
https://github.com/material-components/material-components-android/releases/tag/1.2.0-rc01
修复了导致高亮显示为今天的错误日期的问题 -> commit
以上问题已解决。请参考这个comment.
我已将库更新为:material:1.3.0-alpha02,它对我有帮助。
已尝试 1.4.0。工作正常
我也遇到了同样的问题。我进行了一些搜索,但看起来 material
库中存在问题。
我喜欢一些代码并解决了问题:
CalendarConstraints.Builder calendarConstraintBuilder = new CalendarConstraints.Builder();
calendarConstraintBuilder.setValidator(DateValidatorPointBackward.now());
dateBuilder = MaterialDatePicker.Builder.dateRangePicker();
dateBuilder.setTitleText("Select Date Range");
dateBuilder.setCalendarConstraints(calendarConstraintBuilder.build());
MaterialDatePicker<Pair<Long, Long>> picker = dateBuilder.build();
picker.setMenuVisibility(false);
picker.setAllowEnterTransitionOverlap(false);
picker.show(getActivity().getSupportFragmentManager(), picker.toString());
picker.addOnPositiveButtonClickListener(selection -> {
Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
utc.setTimeInMillis(selection.first);
String startDate = calendarToDate(getActivity(), utc, "dd-MMM-yyyy");
utc.setTimeInMillis(selection.second);
String endDate = calendarToDate(getActivity(), utc, "dd-MMM-yyyy");
date.setText(startDate+" to "+endDate);
});
这是calendarToDate
方法:
public 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);
}