我用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.getWeekyear
和DateTime.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 );
为了得到正确的年份。
编辑:从阅读Calendar
javadocs,您可能 还 需要将开始日期设置为星期一。此外,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提到的错误 快速一线: