下面的代码将日期设置为2015年6月7日午夜。为什么?我的时区是UTC-07:00
Greg Calendar HuntStart = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("M/d/yyyy K:mm a", Locale.US);
try {
HuntStart.setTime(sdf.parse("6/6/2015 12:00 PM"));//AllLists.get(position).HuntStart));
}
catch (ParseException ex) {
}
问题来自于SimpleDateFormat构造函数中使用的小时字母。
查看SimpleDateFormat JavaDoc SimpleDateFormat JavaDoc:
K am/pm时(0-11)
h am/pm小时(1-12)
你正在使用字母K, javadoc说这个选项应该与小时(0-11)一起使用,这样你就可以在你的字符串中使用12。我没有查看类的实现,但毫无疑问这是一个副作用。你重叠了允许的小时范围,所以你进入第二天。很遗憾建造者如此宽容。一个IllegalArgumentException或类似的将是有用的。
总结,你有两个解决方案。
如果你想使用12小时作为源字符串进行解析,你应该在构造函数中使用h字母模式。像这样:
SimpleDateFormat sdf = new SimpleDateFormat("M/d/yyyy h:mm a", Locale.US);
如果你想保持你的小时模式K,你不应该使用带有12的String实例,而应该使用0作为解析方法的输入像这样:
huntStart.setTime(sdf.parse("06/06/2015 00:00 PM"));// AllLists.get(position).HuntStart));
放弃Java日历,转而使用Joda Time。下面的代码为HuntStart返回2015-06-06 t12:00:00 - 000-07:00,如预期的那样。
DateTime HuntStart = new DateTime();
DateTimeFormatter fmt = DateTimeFormat.forPattern("M/d/yyyy h:mm a");
HuntStart = fmt.parseDateTime("6/6/2015 12:00 PM");
使用下面的代码来更新日历对象而不是SimpleDateFormat
HuntStart.set(Calendar.MONTH,Calendar.JUNE);
HuntStart.set(Calendar.DAY_OF_MONTH,6);
HuntStart.set(Calendar.YEAR,2015);
HuntStart.set(Calendar.HOUR,12);
HuntStart.set(Calendar.MINUTE,0);