【关于SimpleDateFormat 的星期计算问题】
2010-12-29 15:56
483 查看
最近有同事在做报表时,发现一个问题,就是有时候,年末的最后一周返回的week in year数值不正确,明明应该是第53周,却变成了第1周,我测试了下,确实有这种现象,研究发现,其实,这里面是有一个规则的:
只要看12月最后一个周的某个日期是否与次年的1月1号是否在同一个week内。如果在同一个week内,那么都属于次年的第一周。
比如拿今年来说: 2010年的12月26~31号,其实都是2011年的第一周。因为1月1号正好是周六。 而“周日 周一,周二。。。周六”才是刚好一周的循环。
代码测试:
SimpleDateFormat wdf = new SimpleDateFormat("yyyy-MM-dd 'week in year:' 第ww周 ");
Calendar cl = Calendar.getInstance();
cl.set(2010, 11, 25);
String format = wdf.format(cl.getTime());
System.out.println(format);//输出 2010-12-25 week in year: 第52周 (这里是正确的)
SimpleDateFormat wdf = new SimpleDateFormat("yyyy-MM-dd 'week in year:' 第ww周 ");
Calendar cl = Calendar.getInstance();
cl.set(2010, 11, 26); //一直到 31号,或者改为cl.set(2011, 0, 1);都是显示同样的结果。
String format = wdf.format(cl.getTime());
System.out.println(format);//输出 2010-12-26 week in year: 第01周 (因为次年1号是周六,跨年了,就都属于次年的第一周)
再看一个年末最后一周不跨年的例子:2011年12月25~31号
SimpleDateFormat wdf = new SimpleDateFormat("yyyy-MM-dd 'week in year:' 第ww周 ");
Calendar cl = Calendar.getInstance();
cl.set(2011, 11, 26); //这里set的日期从25到31都是同样的结果,第53周,是正确的。
String format = wdf.format(cl.getTime());
System.out.println(format);//
2011-12-26 week in year: 第53周 ()
只要看12月最后一个周的某个日期是否与次年的1月1号是否在同一个week内。如果在同一个week内,那么都属于次年的第一周。
比如拿今年来说: 2010年的12月26~31号,其实都是2011年的第一周。因为1月1号正好是周六。 而“周日 周一,周二。。。周六”才是刚好一周的循环。
代码测试:
SimpleDateFormat wdf = new SimpleDateFormat("yyyy-MM-dd 'week in year:' 第ww周 ");
Calendar cl = Calendar.getInstance();
cl.set(2010, 11, 25);
String format = wdf.format(cl.getTime());
System.out.println(format);//输出 2010-12-25 week in year: 第52周 (这里是正确的)
SimpleDateFormat wdf = new SimpleDateFormat("yyyy-MM-dd 'week in year:' 第ww周 ");
Calendar cl = Calendar.getInstance();
cl.set(2010, 11, 26); //一直到 31号,或者改为cl.set(2011, 0, 1);都是显示同样的结果。
String format = wdf.format(cl.getTime());
System.out.println(format);//输出 2010-12-26 week in year: 第01周 (因为次年1号是周六,跨年了,就都属于次年的第一周)
再看一个年末最后一周不跨年的例子:2011年12月25~31号
SimpleDateFormat wdf = new SimpleDateFormat("yyyy-MM-dd 'week in year:' 第ww周 ");
Calendar cl = Calendar.getInstance();
cl.set(2011, 11, 26); //这里set的日期从25到31都是同样的结果,第53周,是正确的。
String format = wdf.format(cl.getTime());
System.out.println(format);//
2011-12-26 week in year: 第53周 ()
相关文章推荐
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat的一个小问题
- 关于 SimpleDateFormat 的非线程安全问题及其解决方案
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于 SimpleDateFormat 的非线程安全问题及其解决方案
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat时间转换总是显示1970年的问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- java 关于SimpleDateFormat线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于 SimpleDateFormat 的非线程安全问题及其解决方案
- JAVA复习资料-关于SimpleDateFormat安全的时间格式化线程安全问题
- SimpleDateFormat的线程安全问题与解决方案