DateFormat产生错误的输出

时间:2013-08-30 19:19:44

标签: java android date-format

我有几个按钮,分别最初显示当前日期和当前时间。单击显示日期的按钮时,它会显示允许用户选择日期的DatePickerFragment,然后将按钮的文本更改为用户选择的日期。另一个Button完全相同,但TimePickerFragment 要初始化按钮,我使用以下代码:

protected void onCreate(Bundle savedInstanceState){
...
df = DateFormat.getDateInstance();
tf = DateFormat.getTimeInstance();
initDate = new GregorianCalendar();
...
updateDateButtons();
updateTimeButtons();
}


private void updateTimeButtons() {
    tf.setCalendar(initDate);
    String text = tf.format(initDate.getTime());
    btnIniTime.setText(text.substring(0, text.lastIndexOf(":")));
}
private void updateDateButtons() {
    df.setCalendar(initDate);
    btnIniDate.setText(df.format(initDate.getTime()));
}

最初,两个按钮都以预期的方式运行:btnIniTime显示当前时间,btnIniDate显示当前日期。
正如我所说,当用户点击btnIniTime按钮时,会显示TimePickerFragment,提示用户选择时间,所选时间会在btnIniTime中正确显示。
问题始于btnIniDate,应该执行相同的操作,但使用DatePickerFragment而不是TimePickerFragment。当用户选择日期时,该按钮会显示不正确的日期。例如,如果我选择2013年8月30日,显示的日期将变为2013年8月26日。如果我选​​择2013年9月1日,则显示2013年9月29日! 我用来改变日期ara的类和方法如下:

public abstract static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    protected TaskActivity activity;
    protected Calendar c;
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.activity = (TaskActivity) activity;
    }

    @Override
    public abstract Dialog onCreateDialog(Bundle savedInstanceState);

    public void onDateSet(DatePicker view, int year, int month, int day) {
        if(activity instanceof TaskActivity){
            setDateResult(year, month, day);
        }
    }

    protected abstract void setDateResult(int year, int month, int day);
}
public static class InitDatePickerFragment extends DatePickerFragment {
    @Override
    protected void setDateResult(int year, int month, int day) {
        activity.setInitDate(year, month, day);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar c = activity.getInitDate();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }
}
...
public Calendar getInitDate() {
    return initDate;
}
public void setInitDate(int year, int month, int day){
    Log.d("TaskActivity", "Year: " + year + "; Month: " + month + "; Day: " + day);
    initDate.set(Calendar.YEAR, year);
    initDate.set(Calendar.MONTH, month);
    initDate.set(Calendar.DAY_OF_WEEK, day);
    updateDateButtons();
}

按下按钮时:

@Override
public void onClick(View v) {
    if(v.equals(btnIniDate)){
        DialogFragment newFragment = new InitDatePickerFragment();
        newFragment.show(getSupportFragmentManager(), "initDatePicker");
    }
    ...
}

顺便说一句,设置日期时,LogCat会产生以下输出(我选择2013年8月30日):

Year: 2013; Month: 7; Day:30

1 个答案:

答案 0 :(得分:0)

问题可能是

initDate.set(Calendar.DAY_OF_WEEK, day);

setInitDate()中。这仅更新一周中的某一天。所以你的日期跳了+ -6

使用

initDate.set(Calendar.DAY_OF_MONTH, day);