当前位置: 首页 > 面试题库 >

SimpleDateFormat周计算

范承望
2023-03-14
问题内容

我用SimpleDateFormat得到一些令人费解的结果,并希望有人可以阐明这个问题。输出:

Time          = Mon Dec 27 00:00:00 PST 2010
2010-01 <--- THIS IS WHAT I DON'T UNDERSTAND
Start of week = Sun Dec 26 00:00:00 PST 2010
2010-01
End of Week   = Sat Jan 01 23:59:59 PST 2011
2011-01

我是否应该将一年的最后一个“周”视为特例?还是这是正确的解释方式?显然,当尝试顺序组织一周时,顺序是不正确的。调整初始值后,2005年12月25日被视为第53周。我还没有看过Joda,看看Joda是否产生类似的结果。

相关代码:

private static Date getStartOfWeek( Date d ) {
  Calendar calendar = Calendar.getInstance();
  calendar.clear();
  calendar.setTime( d );

  calendar.set( Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek() );

  return calendar.getTime();  
}

private static Date getEndOfWeek( Date d ) {
  Calendar calendar = Calendar.getInstance();
  calendar.clear();

  calendar.setTime( d );
  calendar.add( Calendar.WEEK_OF_YEAR, 1 );
  calendar.set( Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek() );
  calendar.add( Calendar.MILLISECOND, -1 );

  return calendar.getTime();
}


Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set( 2010, Calendar.DECEMBER, 27 );
Date d = calendar.getTime();
Date start = getStartOfWeek( d );
Date end = getEndOfWeek( d );
SimpleDateFormat fmt = new SimpleDateFormat( "yyyy-ww" );

System.out.println( "Time          = " + d );
System.out.println( fmt.format( d ) );
System.out.println( "Start of week = " + start );
System.out.println( fmt.format( start ) );
System.out.println( "End of Week   = " + end );
System.out.println( fmt.format( end ) );

背景:我在JasperReports中使用交叉表(分组为星期的日期)时发现了这一点。

编辑:我正在使用JDK 1.6.0_25

编辑:看来,我将不得不使用乔达来获得正确的结果。为了开始/结束一周,我最终使用了:LocalDate.withDayOfWeek。要检索年和周号,我使用DateTime.getWeekyearDateTime.getWeekOfWeekyear


问题答案:

该错误位于您的格式化代码中,而不是Java中。

令人惊讶的行为是由于日期符号中的一个深奥的规则。请注意,在使用周数时,ISO
8601(而不是令人困惑)为年份边界指定了不同的规则。特别是,当使用周数时,2010-12-27被认为是2011年的一部分。

因此,您应该使用“星期”
YYYY而不是通常的年份yyyy。(见http://download.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html#week_year,并在最后一个例子http://download.oracle.com/javase/7/docs/
api / java / text /
SimpleDateFormat.html
。)

另外,日期的标准符号使用显式'W',因此您应该使用new SimpleDateFormat( "YYYY-'W'ww" )

编辑:还有另一个问题。Java似乎默认为非标准的calendar.getMinimalDaysInFirstWeek() == 1,因此您必须设置

calendar.setMinimalDaysInFirstWeek( 4 );

为了得到正确的年份。

编辑:从阅读Calendarjavadocs,您可能 需要将开始日期设置为星期一。此外,YYYY格式说明符似乎在Java
1.7中是新的。有鉴于此,除非您愿意升级到Java的预发行版本,否则我建议您仅使用Joda Time。



 类似资料:
  • java.text.SimpleDateFormat类根据给定的模式格式化日期。 它还用于解析字符串中的日期,其中字符串包含所提及格式的日期。 请参阅以下使用SimpleDateFormat类的示例。 IOTester.java import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.

  • 问题内容: 我正在使用Oracle的to_char()函数将日期转换为星期数(1-53): “ ww”开关为我提供了今年1月的日期的这些值: 快速查看日历表明这些值应为: 如果我使用“ iw”开关而不是“ ww”,则效果不太理想: 是否有另一个Oracle函数可以像我期望的那样计算周数,或者我需要编写自己的函数? 编辑 我正在尝试匹配Crystal Reports使用的逻辑。每个整周从星期日开始。

  • 这是我的代码: 由于某种原因,与可接受值相比,这段代码只产生了小数15位的pi值。我试图通过增加精度值来解决这一点;这增加了位数,但只有前15个仍然是准确的。我试着改变它计算算法的方式,它也不起作用。所以我的问题是,是否可以对这段代码做些什么来使它更加精确,或者我必须使用另一种算法?我将非常感谢对此的帮助,因为我不知道如何在Python中使用这么多的数字进行操作。我希望能够控制程序确定和显示的(正

  • 我在配置中错过了什么? “无限”复选框需要勾选还是不勾选?

  • 问题内容: 我如何知道JavaScript的周数和年份来计算日期?对于第20周和2013年以获得5/16/2013,我正在尝试这样做: 问题答案: function getDateOfWeek(w, y) { var d = (1 + (w - 1) * 7); // 1st of January + 7 days for each week 这使用简单的周定义,即2013年的第20周是5月14日

  • 问题内容: 我想获得任何一年中的周数。即使被接受为全球通用的答案,对于日历,而实际上有几个星期。 有什么方法可以计算出来,或者有什么函数可以帮助我? 问题答案: 根据维基百科关于ISO周日期格式的文章,您可以使用以下代码进行计算。 更新: 似乎来自@Samuel的答案更好,并且没有Luca提到的错误 快速一线: