日历.setTime设置了错误的日期



下面的代码将日期设置为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);

相关内容

  • 没有找到相关文章

最新更新