2014-09-27 28 views
0

我一直在琢磨关于获取特定节日在下一个十年中的每周的日子,所以运行结果将显示10随后的10年中每周的天数。我有编码,但无法弄清楚编码是如何工作的。查找下一个十年在Java中的特定节日的一周中的日期

这里是本书的编码,我特别对它的日期时间算法感到困惑。

public class YearTest { 

    public static void main(String[] args) { 
     int[] date = new int[10]; 
     date = J(2010, 4); 
     M(2010, date); 
     O(2010, date); 
    } 

    public static int[] J(int year, int day) { 
     int[] date = new int[10]; 
     date[0] = day; 

     for (int i = 1; i < 10; i++) { 
      if (
       ((year + i - 1) % 4 == 0) && 
       ((year + i - 1) % 100) != 0 
      ) 
       date[i] = (date[i - 1] + 366) % 7; 
      else 
       date[i] = (date[i - 1] + 365) % 7; 
     } 

     System.out.println("January: "); 
     for (int i = 0; i < 10; i++) 
      System.out.println(date[i] + 1 + " "); 

     return date; 
    } 

} 

下面的代码是为另外两个节日,但我认为我们应该使用M(2010年,日期),而不是?由于日期包括年和日,但在这里我们只需要一天。

M(2010, date); 
O(2010, date); 

在此先感谢。

+0

所以这个其他作者的代码,不是你的?你想了解日期时间的算法?你的问题的确切点不清楚。 – 2014-09-27 07:02:22

+0

正确,抱歉,没有宣布足够清晰。 – 2014-09-27 08:20:41

回答

1

闰年

这代码调整Leap Year

地球围绕太阳(一年)的轨道和地球自转轴(一天)不同步。所以我们必须对日期进行调整,以保持日常日历的正确性。这一调整接近四分之一天,但并不完全。因此,除了每隔几个世纪,我们每隔四年增加一天,除了每隔几个月我们都会这样做。

算法

从维基百科的文章...

if (year is not divisible by 4) then (it is a common year) 
else 
if (year is not divisible by 100) then (it is a leap year) 
else 
if (year is not divisible by 400) then (it is a common year) 
else (it is a leap year) 

使用日期时库

不是滚动自己的代码中,我强烈建议你使用日期时库。对于Java,这意味着要么是Joda-Time,要么是Java8中的java.time包(受Joda-Time的启发,由JSR 310定义)。

避免使用与Java捆绑在一起的旧java.util.Date和.Calendar类,因为它们在设计和实现方面都存在缺陷,并且非常麻烦。

+1

值得注意的是,您列出OP *代码仅使用* 3 *的三个*调整*。幸运的是,最后一次需要规则是古代历史 - 2000年。 – usr2564301 2014-09-27 14:27:01

+0

Jongware,正确。除了评论澄清,代码不是海报的。她或他从某处获得了代码。您发现的错误说明了为什么应该使用可信的日期时间库,而不是自己推出或获取一些代码!日期时间的工作非常复杂,令人困惑,而且容易出错。 – 2014-09-27 14:42:50

相关问题