日期选择对话框在安卓中显示的月份比实际多一个月。

3

当我按下按钮显示DatePickerDialog时,对话框会显示一个月更大。例如,如果我使用joda库的DateTime来初始化当前日期:

   DateTimeZone zone = DateTimeZone.forID("Europe/Athens");

   DateTime dt = new DateTime(zone);


   int year = dt.getYear();
   int month = dt.getMonthOfYear();
   int day = dt.getDayOfMonth();

在日期选择对话框中,当选定的日期是07/08/2014时,日期对话框会显示比选定日期多一个月的日期07/09/2014。我不明白为什么会出现这种情况。

代表日期选择器的代码片段如下:

 @SuppressLint("ValidFragment")
    public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{

        @SuppressLint("ValidFragment")
        TextView txtDate;
        GlobalData appState;


         public DatePickerFragment(TextView txtDate) {
            super();
            this.txtDate = txtDate;
        }

        @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                // Use the current date as the default date in the picker
                DateTimeZone zone = DateTimeZone.forID("Europe/Athens");
                DateTime dt = new DateTime(zone);

                int year = dt.getYear();
                int month = dt.getMonthOfYear();
                int day = dt.getDayOfMonth();

                Log.i("DatePickerFragment day month year", day +" "+ month + " "+ year + "");

                // Create a new instance of DatePickerDialog and return it
                return new DatePickerDialog(getActivity(), this, year, month, day);
            }

            public void onDateSet(DatePicker view, int year, int month, int day) {
                appState.setDateUserFrom(year, month, day);

                Log.i("Date day month yerar", "Date changed." +  day+" " + month + " " +year);
                txtDate.setText(new StringBuilder().append(day)
                       .append("-").append(month).append("-").append(year)
                       .append(" "));
            }



    }

通常情况下,月份会减少一个(谈论Java),这是按设计来的。 - Skynet
5个回答

12

DatePickerDialog接受monthOfYear的范围是0到11[0代表1月,11代表12月],而您的DateTime返回值是1到12。因此,您需要将月份值减去1

使用以下代码:

return new DatePickerDialog(getActivity(), this, year, month - 1, day);

请解释为什么这种行为会发生,而不是从日历中减去一个月。 - Skynet
然后您需要再次添加+1,因为您使用的是Joda而不是Java日期。 - Julian Pieles
是的,Julian Liebl是正确的,你为什么不使用日历获取日期?有特定的原因吗? - Pankaj Kumar
1
@ByzantineFailure 从日历中减去月份是错误的。这样会导致星期几不对。例如,03-18-14 Jodatime 在 java 的 Calendar 类中等同于 02-18-14 (MM-dd-YY)。更合理的做法是在将其发送到 DatePickerDialog 之前仅减去月份值。 - Andy
所以,joda库的月份从1到12,因此我应该在onCreateDialog中将月份减去1,然后在onDateSet中将月份加上1。我尝试了一下,它可以工作!谢谢大家! - zoe vas
显示剩余2条评论

2
public Dialog onCreateDialog(Bundle savedInstanceState) {
                // Use the current date as the default date in the picker
                DateTimeZone zone = DateTimeZone.forID("Europe/Athens");
                DateTime dt = new DateTime(zone);

                int year = dt.getYear();
                int month = dt.getMonthOfYear()-1;
                int day = dt.getDayOfMonth();

                Log.i("DatePickerFragment day month year", day +" "+ month + " "+ year + "");

                // Create a new instance of DatePickerDialog and return it
                return new DatePickerDialog(getActivity(), this, year, month, day);
            }

日期选择器中的月份从零开始计算。因此,您应该从getMonthOfYear()中减去一来在日期选择器上设置它。


0

我相信这背后的原因是因为Android DatePickerDialog期望基于0的月份值。Jodatime返回它们,就像你期望的一样(更加人性化)。所以只需从月份中减去1。

只是为了澄清,大多数日期函数/库默认使用基于0的月份值进行设计。除非有明确说明或第三方库(如Jodatime)使得处理日期问题变得轻松愉快。


0

试试这个,希望它能起作用:

DateTimeZone zone = DateTimeZone.forID("Europe/Athens");

       DateTime dt = new DateTime(zone);


       int year = dt.getYear();
       int month = dt.getMonth();
       int day = dt.getDayOfMonth();

或者

DateTimeZone zone = DateTimeZone.forID("Europe/Athens");

   DateTime dt = new DateTime(zone);


   int year = dt.getYear();
   int month = dt.getMonthOfYear() - 1;
   int day = dt.getDayOfMonth();

我尝试了你的建议。对话框显示的日期是07-08-2014,但传递给onDateSet方法的月份比输入日期(07-08-14)少一个月,即07-07-2014。 - zoe vas

0

我猜测,Joda月份从1月开始,但Java日期从0月开始?因此,如果您使用当前日期作为joda的起始日期,则日期选择器将显示错误的月份。简单的解决方案:

month = dt.getMonthOfYear() - 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接