有谁知道为什么以下代码在Windows上正常工作而不在Mac上? 今天(24/11/2010)应该按照MacOS返回47而不是48
def fm_date = '24/11/2010'
import java.text.SimpleDateFormat
def lPad = {it ->
st = '00' + it.toString()
return st.substring(st.length()-2, st.length())
}
dfm = new SimpleDateFormat("dd/MM/yyyy")
cal=Calendar.getInstance()
cal.setTime( dfm.parse(fm_date) )
now = cal.get(Calendar.WEEK_OF_YEAR)
cal.add(Calendar.DAY_OF_MONTH,-7)
prev = cal.get(Calendar.WEEK_OF_YEAR)
cal.add(Calendar.DAY_OF_MONTH,14)
next = cal.get(Calendar.WEEK_OF_YEAR)
prev = 'diary' + lPad(prev) + '.shtml'
next = 'diary' + lPad(next) + '.shtml'
return 'diary' + lPad(now) + '.shtml'
答案 0 :(得分:1)
我认为这是ISO周编号问题......
如果我使用你的代码改编(和groovyfied):
import java.text.SimpleDateFormat
def fm_date = '24/11/2010'
Calendar.getInstance().with { cal ->
// We want ISO Week numbers
cal.firstDayOfWeek = MONDAY
cal.minimalDaysInFirstWeek = 4
setTime new SimpleDateFormat( 'dd/MM/yyyy' ).parse( fm_date )
now = cal[ WEEK_OF_YEAR ]
}
"diary${"$now".padLeft( 2, '0' )}.shtml"
我收到了diary47.shtml
如documentation for GregorianCalendar所述,如果您想要ISO月号:
为WEEK_OF_YEAR计算的值 字段范围从1到53.第1周为a 年是最早的七天 从getFirstDayOfWeek()开始 至少包含 getMinimalDaysInFirstWeek()天 那年。因此它取决于 getMinimalDaysInFirstWeek()的值, getFirstDayOfWeek()和当天 1月1周。周之间 一年的第1周和第1周的第1周 下一年是有编号的 顺序从2到52或53(如 需要)。
例如,1998年1月1日是一个 星期四。 如果是getFirstDayOfWeek() 星期一和getMinimalDaysInFirstWeek() 是4(这些是反映的值 ISO 8601和许多国家标准), 然后在1998年第1周开始于12月 1997年1月29日,并于1998年1月4日结束。 但是,如果是getFirstDayOfWeek() 星期日,1998年第1周开始 1998年1月4日,1月结束 1998年10月; 1998年头三天 然后是1997年第53周的一部分。
修改强>
甚至Groovier(来自John的评论)
def fm_date = '24/11/2010'
Calendar.getInstance().with { cal ->
// We want ISO Week numbers
cal.firstDayOfWeek = MONDAY
cal.minimalDaysInFirstWeek = 4
cal.time = Date.parse( 'dd/MM/yyyy', fm_date )
now = cal[ WEEK_OF_YEAR ]
}
"diary${"$now".padLeft( 2, '0' )}.shtml"
<强> EDIT2 强>
在Windows上使用VirtualBox运行此功能,得到了相同的结果