时间选择对话框及上午或下午(AM或PM)

61
我有一个 TimePickerDialog,其 is24Hour 属性设置为 false,因为我想呈现给最终用户更熟悉的12小时格式。当设置小时、分钟和上午/下午标识并返回时间时,如何确定最终用户选择了上午还是下午?
这是我监听器的内容:
private TimePickerDialog.OnTimeSetListener mTimeSetListener =
      new TimePickerDialog.OnTimeSetListener() {

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, 
      int minute) {
     mHour = hourOfDay;
     mMinute = minute;
    // mIsAM = WHERE CAN I GET THIS VALUE
    }
};
25个回答

81

hourOfDay 始终为24小时制。如果使用 is24HourView 设置为 false,用户将不必处理24小时格式的时间,但在调用 onTimeSet() 时,Android 会将其转换为24小时制。


7
好的,其实文档里并没有详细说明... :-) - CommonsWare
16
使用以下代码可以获取用户的首选24小时设置:DateFormat.is24HourFormat(context); - Josh Clemm
@CommonsWare,您能否提供明确的描述或任何示例链接?我也遇到了同样的上午/下午问题。 - Apurva
@CommonsWare但问题仍然存在...如何从TimePicker回调中找到timeConvention单位am/pm..有什么建议吗? - CoDe
2
@Shubh:如果 hourOfDay 大于等于12,则 AM/PM 指示器将为 PM。当然,这与 Android 无关,而与了解12小时制和24小时制时间约定有关。 - CommonsWare
显示剩余3条评论

45

这对我起作用:

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    String am_pm = "";

    Calendar datetime = Calendar.getInstance();
    datetime.set(Calendar.HOUR_OF_DAY, hourOfDay);
    datetime.set(Calendar.MINUTE, minute);

    if (datetime.get(Calendar.AM_PM) == Calendar.AM)
        am_pm = "AM";
    else if (datetime.get(Calendar.AM_PM) == Calendar.PM)
        am_pm = "PM";

    String strHrsToShow = (datetime.get(Calendar.HOUR) == 0) ?"12":datetime.get(Calendar.HOUR)+""; 

    ((Button)getActivity().findViewById(R.id.btnEventStartTime)).setText( strHrsToShow+":"+datetime.get(Calendar.MINUTE)+" "+am_pm );
}

@LargeGlasses 很高兴它能帮到你 :-) - Adil Malik
它给我相反的选择,上午变成了下午,下午变成了上午。 - CoDe
@Shubh,不确定你的情况出了什么问题。相同的代码对我和其他人都运行良好。建议你为这个相反的问题创建一个新的问题,并在那里分享你的代码。 - Adil Malik
@Shubh请确保在上述函数的hourOfDayminute参数中传递正确的值。 - Adil Malik
我在某个地方读到了@commonsware的评论,他说onTimeSet()总是以24小时格式返回,然后另一篇帖子帮助我将其转换为上午和下午..谢谢。 - CoDe
显示剩余3条评论

15

我遇到了同样的问题。我的应用中有一个TimePicker,在您选择时间并点击按钮后,您将被带到一个屏幕上,显示所选的时间。选择的“时间”是正确的,但有时上午/下午的值会与所选的相反。最终,我通过更改保存在TimePicker中的“小时”参数来解决了这个问题。

private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() 
{   
    @Override
    public void onTimeSet(TimePicker view, int hrs, int mins)
    {
        hour = hrs;
        minute = mins;

        c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY, hour);
        //instead of c.set(Calendar.HOUR, hour);
        c.set(Calendar.MINUTE, minute);
现在,当我点击按钮进入下一个屏幕时,它正确地显示了所选的AM/PM值。

2
将 HOUR 更改为 HOUR_OF_DAY 解决了 AM/PM 相反的问题。创建新的 TimePickerDialog 时,还必须为小时参数设置 HOUR_OF_DAY,以便在首次打开对话框时选择正确的 AM/PM。 - RH201
@oelreeves 非常有帮助。谢谢。 - Omer123
@RH201,你还提出了另一个我有问题的观点。谢谢。 - Omer123

14

一个整洁的提示信息,显示用户选择的内容,以正确的HH:MM格式。

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        String AM_PM = " AM";
        String mm_precede = "";
        if (hourOfDay >= 12) {
            AM_PM = " PM";
            if (hourOfDay >=13 && hourOfDay < 24) {
                hourOfDay -= 12;
            }
            else {
                hourOfDay = 12;
            }
        } else if (hourOfDay == 0) {
            hourOfDay = 12;
        }
        if (minute < 10) {
            mm_precede = "0";
        }
        Toast.makeText(mContext, "" + hourOfDay + ":" + mm_precede + minute + AM_PM, Toast.LENGTH_SHORT).show();
    }

13
 private String getTime(int hr,int min) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY,hr);
        cal.set(Calendar.MINUTE,min);
        Format formatter;
        formatter = new SimpleDateFormat("h:mm a");
        return formatter.format(cal.getTime());
    }

1
好的答案,这个方法返回以下输出示例:下午4:30或上午4:30 - Leo Galindo

13

尝试这种简单的方法:

 void openTimeFragment() {
        TimePickerDialog mTimePicker;

        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        mTimePicker = new TimePickerDialog(YourActivity.this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {



                String time = selectedHour + ":" + selectedMinute;

                  SimpleDateFormat fmt = new SimpleDateFormat("HH:mm");
        Date date = null;
        try {
            date = fmt.parse(time );
        } catch (ParseException e) {

            e.printStackTrace();
        }

        SimpleDateFormat fmtOut = new SimpleDateFormat("hh:mm aa");

          String formattedTime=fmtOut.format(date);

                edtTextTime.setText(formattedTime);
            }
        }, hour, minute, false);//No 24 hour time
        mTimePicker.setTitle("Select Time");
        mTimePicker.show();
    }

1
简单而优雅的解决方案。谢谢 :) - Md. Sajedul Karim
@Md.SajedulKarim: :) - Neha Tyagi
起初我忽略了你的解决方案并尝试了其他方法,但最终问题得到了解决。非常好的解决方案,谢谢。 - Sagar Chavada

10

嗨,你可以像这样使用自己的格式:

    String myFormat = "hh:mm a"; // your own format
    SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
    String  formated_time = sdf.format(calendar_time.getTime()); //format your time

我发现在时间格式中,“a”代表上午或下午的代码:http://www.tutorialspoint.com/java/java_date_time.htm


1
非常感谢,让我今晚心情愉快 :P - Pratik Butani

3
如果您希望直接在时间选择对话框中设置上午/下午,有一个解决方法。如果您预先使用当前/默认时间填充EditText,则此方法有效。 - 在实例化对话框之前,如果EditText具有PM时间值,请将小时组件增加12个小时。
sref_Time3是ampm值;sref_Time1是小时组件。
    if (sref_Time3.equals("PM")) {
        hour = hour + 12;
    } else if (sref_Time1.equals("12")) {
        hour = 0;
    }
    // Create a new instance of TimePickerDialog and return it
    return new TimePickerDialog(getActivity(), this, hour, minute,
               DateFormat.is24HourFormat(getActivity()));

感谢与问候。

屏幕 时间选择器对话框


2
public static class TimePickerFragment extends DialogFragment
        implements TimePickerDialog.OnTimeSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current time as the default values for the picker
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR);
        int minute = c.get(Calendar.MINUTE);

        // Create a new instance of TimePickerDialog and return it
        return new TimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()));
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(0, 0, 0, hourOfDay, minute);
        textView.setText((String) DateFormat.format("hh:mm aaa", calendar));
    }
}


//For showing the dialog put below two lines where you want to call

TimePickerFragment timePickerFragment = new TimePickerFragment();
timePickerFragment.show(getSupportFragmentManager(), "TimePicker");

2

尝试这个:

        Calendar calendar = Calendar.getInstance();
        calendar.set(0, 0, 0, hourOfDay, minute, 0);
        long timeInMillis = calendar.getTimeInMillis();
        java.text.DateFormat dateFormatter = new SimpleDateFormat("hh:mm a");
        Date date = new Date();
        date.setTime(timeInMillis);
        time.setText(dateFormatter.format(date));

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