将 DatePicker 中的第一天设置为星期一

Posted

技术标签:

【中文标题】将 DatePicker 中的第一天设置为星期一【英文标题】:Set first day of week in DatePicker to monday 【发布时间】:2012-11-17 20:22:32 【问题描述】:

我有一个 DatePicker,我在其中禁用了 SpinnerView,现在只使用 CalendarView。但它从星期天开始,我想用星期一作为一周的第一天。我该如何改变呢?我猜第一天将取决于手机设置,但在我的瑞士手机上它仍然是错误的......

我没有找到任何设置方法或任何 XML 命令。

<DatePicker
   android:id="@+id/date_picker"
   android:layout_
   android:layout_
   android:layout_alignParentLeft="true"
   android:layout_alignParentRight="true" />

DatePicker datePicker = (DatePicker)   convertView.findViewById(R.id.date_picker);
datePicker.setSpinnersShown(false);

------------编辑:------------

我尝试更改语言环境:

Locale.setDefault(Locale.GERMAN);

但这并没有改变任何东西。所以我阅读了我发现的android-17.android.widget.DatePicker.java:

public DatePicker(Context context, AttributeSet attrs, int defStyle) 
  //...  
  // initialization based on locale
        setCurrentLocale(Locale.getDefault());
  //...



 /**
 * Sets the current locale.
 *
 * @param locale The current locale.
 */
private void setCurrentLocale(Locale locale) 
    if (locale.equals(mCurrentLocale)) 
        return;
    

    mCurrentLocale = locale;

    mTempDate = getCalendarForLocale(mTempDate, locale);
    mMinDate = getCalendarForLocale(mMinDate, locale);
    mMaxDate = getCalendarForLocale(mMaxDate, locale);
    mCurrentDate = getCalendarForLocale(mCurrentDate, locale);

    mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1;
    mShortMonths = new String[mNumberOfMonths];
    for (int i = 0; i < mNumberOfMonths; i++) 
        mShortMonths[i] = DateUtils.getMonthString(Calendar.JANUARY + i,
                DateUtils.LENGTH_MEDIUM);
    


 /**
 * Gets a calendar for locale bootstrapped with the value of a given calendar.
 *
 * @param oldCalendar The old calendar.
 * @param locale The locale.
 */
private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) 
    if (oldCalendar == null) 
        return Calendar.getInstance(locale);
     else 
        final long currentTimeMillis = oldCalendar.getTimeInMillis();
        Calendar newCalendar = Calendar.getInstance(locale);
        newCalendar.setTimeInMillis(currentTimeMillis);
        return newCalendar;
    

那么为什么 Locale.setDefault(Locale.GERMAN) 不起作用?! 正如您在上面看到的,我从 XML 中获取了 DatePicker .. 有什么错误吗?!

【问题讨论】:

这应该取决于您的语言环境。 也不应该是 3 个微调器吗? (在这种情况下,无论如何都不会显示一周的第一天) 我更喜欢日历样式,所以没有 3 个微调器。您对语言环境的确切含义是什么?你觉得我手机的本地化可能不正确? 【参考方案1】:

您必须手动设置一周的第一天,例如在您的活动/片段的 onCreate()/onCreateView() 中:

date = (DatePicker) value.findViewById(R.id.date);
if (Build.VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1) 
    date.setSpinnersShown(false);
    date.setCalendarViewShown(true);
    date.getCalendarView().setFirstDayOfWeek(Calendar.getInstance().getFirstDayOfWeek());

上面的示例使用默认语言环境(Calendar.getInstance() 确实如此),但是您可以手动指定日期:

date.getCalendarView().setFirstDayOfWeek(Calendar.MONDAY);

【讨论】:

仅供参考:getCalendarView() 需要 API 12 而不是 11。我通过编辑修复了这个问题。【参考方案2】:

当前接受的使用 getCalendarView() 的答案已弃用 Material 样式。

但是,您可以在 DatePicker 实例上调用 setFirstDayOfWeek()。或者,如果您要启动 DatePickerDialog:

DatePickerDialog datePickerDlg = new DatePickerDialog(...);
datePickerDlg.getDatePicker().setFirstDayOfWeek(Calendar.MONDAY);
datePickerDlg.show();

【讨论】:

需要最低 api 级别 21【参考方案3】:

这取决于您设备的本地化。

看这里:How to make GWT DatePicker to use Monday as the first day of the week?

【讨论】:

是的,我已经看过这篇文章,但它是关于/with/in (whatever) GWT。我无法在我的 android 应用程序中实现它,或者我可以吗?

以上是关于将 DatePicker 中的第一天设置为星期一的主要内容,如果未能解决你的问题,请参考以下文章

如何使 GWT DatePicker 使用星期一作为一周的第一天?

如何将 Angular 日期范围选择器中的日期设置为该月的第一天

如何将星期天设置为excel对周计算的第一天。

使用存储过程将星期一计算为一周的第一天

Flutter - showDatePicker 将一周的第一天设置为星期一

JS学校里怎么计算本周是该年的第几周