为何DAY_OF_WEEK多算一天?Calendar与Date API返回结果异常
问题根源:时间戳单位不匹配
你遇到的问题核心其实很直白——Java的Calendar.setTimeInMillis()和Date构造函数要求传入的是毫秒级时间戳,但你用的1560049200是秒级时间戳。
具体拆解:
当你把秒级戳直接当作毫秒传入时,实际对应的时间是1970-01-19 04:40:49.200 UTC,这个时间确实是周一(Monday):
cal.get(Calendar.DAY_OF_WEEK)返回2,正好等于Calendar.MONDAY的常量值(2),所以判断返回true;Date.getDay()返回1,因为这个方法的规则是0=周日,1=周一……6=周六,也完全匹配该时间的结果。
而你预期的周日(Sunday)对应的应该是毫秒级时间戳1560049200000(原秒级戳乘以1000),这个时间的UTC时刻是2019-06-09 03:00:00,转换到美国时区后属于周日范畴。
修复后的代码示例:
// 注意加L声明为长整型,避免整数溢出 Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(1560049200L * 1000); System.out.println(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY); // 现在返回true System.out.println(cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US)); // 输出Sunday // Date类的修复版本(注:Date类多数方法已过时,建议优先用Calendar或Java8+的java.time API) Date date = new Date(1560049200L * 1000); System.out.println(date.getDay()); // 返回0,对应周日
额外小提示:
Date类的getDay()等方法早已被标记为过时,如果你是Java 8及以上版本,更推荐使用java.time包下的API(比如ZonedDateTime、DayOfWeek),日期时间的处理逻辑会更清晰,也不容易踩这类单位坑。
内容的提问来源于stack exchange,提问作者Drago
相关产品推荐
相关产品推荐

