我想要AMPM格式的日期。例子建议使用简单的日期格式(SimpleDateFormat),并加上a或aa,但这对我来说根本行不通。
首先,我设置了日期。然后我将开始时间的视图设置为可见。
结果是格式为Wed 20 May 20 01:00:00 EDT 2020,想要像Wed 20 May 20 01:00:00 AM EDT 2020这样的格式。
这适用于setStartTime方法中的calendar.getTime()。第一个方法之所以被包含在内,是因为所选的日期是作为一个全局变量链接的。问题出在第二个方法上。
我也许可以手动将最终的日期改为字符串并转换回来,但我不想增加不必要的复杂性。我想找出为什么Calendar不会成功,因为这应该是非常基本的。
最后我的目标是将日期添加到firebase。它必须在Android、IOS和Web上统一。因此,我需要日期是以这种精确的格式。
下面是代码。
SimpleDateFormat serviceSETimeFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm aa");
public void setStartDay(View view)
{
Calendar calendar = Calendar.getInstance();
DatePickerDialog picker = new DatePickerDialog(ServiceCreation.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
GregorianCalendar mCal = new GregorianCalendar(year, monthOfYear, dayOfMonth);
Date dateForDisplay = mCal.getTime();
int startHourIndex = getThirdSpaceIndex(dateForDisplay.toString());
//SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
serviceSETimeFormat.setCalendar(mCal);
Date dateFormatted = null;
try{
dateFormatted= serviceSETimeFormat.parse(serviceSETimeFormat.format(mCal.getTime()));
currBaseStartDate=dateFormatted;
}
catch(ParseException p){
Log.wtf("SC","Parse exc34");
}
Log.wtf("SC","Here is orig date: "+dateFormatted);
//Don't show hh/mm/ss (these are held as 0)
startDayView.setText(dateForDisplay.toString().substring(0,startHourIndex));
startEndTimeWrapper.setVisibility(View.VISIBLE);
}
}, calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));
long currentTime = new Date().getTime();
picker.getDatePicker().setMinDate(currentTime);
picker.show();
}
public void setStartTime(View view) {
TimePickerDialog mTimePicker = new TimePickerDialog(ServiceCreation.this,
android.R.style.Theme_Holo_Light_Dialog_NoActionBar, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
String minuteAsS = Integer.toString(selectedMinute);
if(minuteAsS.length()==1){
minuteAsS="0"+minuteAsS;
}
if(selectedHour==0){
startTimeView.setText((selectedHour+12)+":"+minuteAsS+" AM");
}
else if(selectedHour<12){
startTimeView.setText(selectedHour+":"+minuteAsS+" AM");
}
else if(selectedHour==12){
startTimeView.setText((selectedHour)+":"+minuteAsS+" PM");
}
else{
startTimeView.setText((selectedHour-12)+":"+minuteAsS+" PM");
}
(findViewById(R.id.endTimeWrapper)).setVisibility(View.VISIBLE);
Calendar calendar = new GregorianCalendar();
calendar.setTime(currBaseStartDate);
calendar.set(Calendar.MINUTE, selectedMinute);
Log.wtf("SC","Hour before condition: "+selectedHour);
if(selectedHour>=12){
if(selectedHour!=12){
Log.wtf("SC","Decrementing hour");
selectedHour-=12;
}
Log.wtf("SC","Hour set: "+selectedHour);
calendar.set(Calendar.AM_PM,Calendar.PM);
calendar.set(Calendar.HOUR_OF_DAY,selectedHour);
}
else{
calendar.set(Calendar.AM_PM,Calendar.AM);
calendar.set(Calendar.HOUR_OF_DAY,selectedHour);
}
startTime=calendar.getTime();
Log.wtf("SC","Here is orig start time: "+startTime);
try{
startTime=serviceSETimeFormat.parse(serviceSETimeFormat.format(startTime));
Log.wtf("SC","Here is parsed start time: "+startTime);
}
catch(ParseException e){
Log.wtf("SC","START DATE PARSE EXCEPTION");
}
}
}, 12, 0, false);
mTimePicker.setTitle("Select Start Time: ");
mTimePicker.show();
}
三点。
Calendar
, GregorianCalendar
, SimpleDateFormat
和 Date
是混乱的,糟糕的设计和长期过时的类。现代的API要好用得多。Calendar
或 Date
与AM或PM。你要把你的模型和你对用户的展示分开。在模型中,您需要一个 LocalDateTime
或其他适当的日期-时间对象,你不想担心它的格式,不管它使用的是12小时还是24小时时钟。为了向用户显示日期和时间,你需要以一个 绳子 以适合您的用户的格式,包括AM或PM。这也是为什么您的观点有一个 setText
方法,而不 setDate
方法。Date
与AMPM格式可以存在。你在问不可能的事情。构建一个 LocalDate
年、月、日三个整数的对象。
int year = 2020;
int monthOfYear = Calendar.MAY; // Don’t use Calendar, though
int dayOfMonth = 11;
LocalDate date = LocalDate.of(year, monthOfYear + 1, dayOfMonth);
System.out.println(date);
输出:
2020-05-11
我相信你的日期选择器的月份数是从0代表一月到11代表十二月。所以,我们需要在月号上加1,以转换为人类和 LocalDate
数月。我只使用了来自 Calendar
类来初始化变量为基于0的月份数,不要在你的代码中这样做,因为值来自数据选取器。Calendar
使用同样疯狂的编号。
要将日期显示回给用户使用格式化器将其格式化为一个字符串。
DateTimeFormatter dateFormatter = DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.US);
String dateForDisplay = date.format(dateFormatter);
System.out.println(dateForDisplay);
2020年5月11日
给出适当的地点,或者不说呼叫到 withLocale()
以依赖设备的地域设置。
当用户选择时间时。
int selectedHour = 1;
int selectedMinute = 0;
LocalTime selectedTime = LocalTime.of(selectedHour, selectedMinute);
LocalDateTime dateTime = date.atTime(selectedTime);
System.out.println(dateTime);
2020-05-11T01:00
时间的格式化可以和我们对日期的处理方式非常相似。
DateTimeFormatter timeFormatter = DateTimeFormatter
.ofLocalizedTime(FormatStyle.MEDIUM)
.withLocale(Locale.US);
String timeForDisplay = selectedTime.format(timeFormatter);
System.out.println(timeForDisplay);
1: 00: 00 AM
java.time在新旧Android设备上都能很好地工作。它只是要求至少有 Java 6.
org.threeten.bp
与子包。java.time
被首次描述。java.time
到Java 6和7(ThreeTen for JSR-310)。