以下代码将日期设定为2015年6月7日的午夜。为什么?我的时区是UTC-07:00
格雷格
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) {
}
答案 0 :(得分:2)
问题来自您在SimpleDateFormat构造函数中使用的小时字母。
请参阅SimpleDateFormat JavaDoc SimpleDateFormat javaDoc:
上午/下午的K小时(0-11)
h上午/下午(1-12)小时
您使用的是字母 K ,而javadoc表示此选项应与小时(0-11)一起使用,以便您使用 12 你的String中的strong>。 我没有看过课程的实现,但毫无疑问是副作用。您重叠允许的小时范围,因此您将进入第二天。 构造函数如此宽容,这很可怜。 IllegalArgumentException等会很有用。
总而言之,您有2个解决方案。
如果你想使用12小时作为源字符串进行解析,你应该在构造函数中使用 h 字母模式。 像那样:
SimpleDateFormat sdf = new SimpleDateFormat("M/d/yyyy h:mm a", Locale.US);
如果要保持小时模式 K ,则不应使用带有12但 0 的String实例作为解析方法的输入 像那样:
huntStart.setTime(sdf.parse("06/06/2015 00:00 PM"));// AllLists.get(position).HuntStart));
答案 1 :(得分:0)
放弃Java Calendar并切换到Joda Time。以下代码按预期返回2015-06-06T12:00:00.000-07:00 for HuntStart。
DateTime HuntStart = new DateTime();
DateTimeFormatter fmt = DateTimeFormat.forPattern("M/d/yyyy h:mm a");
HuntStart = fmt.parseDateTime("6/6/2015 12:00 PM");
答案 2 :(得分:-2)
使用以下代码更新日历对象而不是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);