Calendar.setTime设置错误的日期

时间:2015-06-06 19:14:38

标签: java android datetime

以下代码将日期设定为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) {

            }

3 个答案:

答案 0 :(得分:2)

问题来自您在SimpleDateFormat构造函数中使用的小时字母。

请参阅SimpleDateFormat JavaDoc SimpleDateFormat javaDoc

上午/下午的K小时(0-11)
h上午/下午(1-12)小时

您使用的是字母 K ,而javadoc表示此选项应与小时(0-11)一起使用,以便您使用 12 。 我没有看过课程的实现,但毫无疑问是副作用。您重叠允许的小时范围,因此您将进入第二天。 构造函数如此宽容,这很可怜。 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);