Joda时间周计算推理

时间:2010-02-06 21:26:21

标签: java calendar jodatime week-number

下面的代码演示了星期计算的有问题的joda-time实现。这种行为不是错误,而是设计决策Joda-Time uses the ISO standard Monday to Sunday week.(也许它应该是一个错误?)

考虑到我需要计算周数的日期,这个计算必须是i18n。含义我必须根据用户的区域设置考虑正确的周编号。

下面的演示代码显示了Joda-Time的错误计算和JDK的正确计算,在我们尝试坚持使用的应用程序中,Joda-Time是日期操作的优秀解决方案。那么,我应该混合两个时间计算库吗?我显然不愿意,这甚至是一件安全的事情,还是我会陷入困境(有日期,日历的经验我知道这对Java来说是一个痛苦的问题)。

结论:建议的最佳做法是什么?

问题演示代码

请参阅此online calendar displaying week numbers了解正确的周计算示例。

public class JodaTest {
 static DateTimeFormatter formatter = DateTimeFormat.forPattern("ww yyyy");
 static SimpleDateFormat jdkFormatter = new SimpleDateFormat("ww yyyy");

 public static void main(String[] args) {
  DateTime time = new DateTime(/*year*/2009, /*monthOfYear*/12, /*dayOfMonth*/6, /*hourOfDay*/23, /*minuteOfHour*/0, /*secondOfMinute*/0, /*millisOfSecond*/0);

  StringBuilder buffer = new StringBuilder()
   .append("Testing date ").append(time.toString()).append("\n")
   .append("Joda-Time timezone is ").append(DateTimeZone.getDefault()).append(" yet joda wrongly thinks week is ").append(formatter.print(time)).append("\n")
   .append("JDK timezone is ").append(TimeZone.getDefault().getID()).append(" yet jdk rightfully thinks week is ").append(jdkFormatter.format(time.toDate())).append(" (jdk got it right ?!?!)");

  System.out.println(buffer.toString());
 }
}

输出:

Testing date 2009-12-06T23:00:00.000+02:00
Joda-Time timezone is Asia/Jerusalem yet joda wrongly thinks week is 49 2009
JDK time zone is Asia/Jerusalem yet jdk rightfully thinks week is 50 2009 (jdk got it right ?!?!)

1 个答案:

答案 0 :(得分:2)

最好的解决方案是编写DateTimeField的实现,它包含逻辑以根据区域设置提取所需的值。在内部,您可能仍然依赖于JDK数据。目的是将所有JDK代码包装在一个可重用的类中。然后你就这样使用它:

int value = dateTime.get(new LocaleAwareWeekField("en_GB"));