当我试图理解Sakamoto's algorithm找到某个特定日期的日期时,就出现了这个问题。
我发现即使在阅读了以下 Stackoverflow answer 后,算法的工作也难以理解
所以,我决定首先解决一个特定的问题,即找到某一年开始的日子(1月1日)。
从Sakamoto的算法中,我只是添加了由跳跃和非闰年贡献的额外天数。 我的代码如下:
public String getDay(String date)
{
String[] days = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
int day = Integer.parseInt(date.split("/")[0]);
int month = Integer.parseInt(date.split("/")[1]);
int year = Integer.parseInt(date.split("/")[2]);
year--; // to calculate the additional days till the previous year
int dayOfTheWeek = (year + year/4 - year/100 + year/400) % 7;
return days[dayOfTheWeek];
}
因此,对于日期“1/1/0001”,它将返回星期日。
为了验证其正确性,我实施了Sakamoto的算法并对结果进行了比较,我的程序的结果似乎总是在Sakamoto算法返回的前一天。
对于日期“1/1/0001”我的节目返回星期日,而Sakamoto的星期一返回。
所以,
1)这是否意味着公历是在星期一而不是星期日开始的?
2)如果是,是否意味着我应该在结果中添加1以获得正确的一天,或者我的程序在逻辑上是不正确的?
最后,我使用 TimeAndDate 网站日计算器工具,并在星期六开始使用“1/1/0001”。
我的最后一个问题是
3)格里高利历在哪一天开始?
非常感谢对这些问题的任何启发。
谢谢,
答案 0 :(得分:0)
重新发明轮子究竟是什么意思?
Joda-Time是Java中日期时间操作的事实标准,它为dayOfWeek
个对象提供DateTime
方法。参见例如http://joda-time.sourceforge.net/userguide.html#Querying_DateTimes
如果您仍然对如何正确计算的详细信息感兴趣,请参阅https://github.com/JodaOrg/joda-time/blob/master/src/main/java/org/joda/time/chrono/BasicChronology.java#L538