【问题标题】:Finding the day in which a given year begins查找给定年份的开始日期
【发布时间】:2014-05-21 10:11:14
【问题描述】:

当我试图理解 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”,它返回星期日。

为了验证它的正确性,我实现了坂本算法并比较了结果,我的程序的结果似乎总是在坂本算法返回的前一天。

对于日期“0001 年 1 月 1 日”,我的程序周日返回,而 Sakamoto 的程序周一返回。

所以,

1) 这是否意味着公历从星期一而不是星期日开始?

2) 如果是,是否意味着我应该在结果中加 1 才能获得正确的日期,还是我的程序在逻辑上不正确?

最后,我使用了 TimeAndDate 网站的日期计算器工具,“1/1/0001”从星期六开始。

我的最后一个问题是

3) 公历从哪一天开始?

非常感谢您对这些问题的任何了解。

谢谢,

【问题讨论】:

    标签: algorithm date


    【解决方案1】:

    重新发明轮子到底有什么意义?

    Joda-Time 是 Java 中日期时间操作的事实标准,它为其DateTime 对象提供了dayOfWeek 方法。参见例如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

    【讨论】:

    • 我将其作为一个学习练习,以了解屏幕后面发生的事情。此外,我的问题并不特定于任何特定语言,而是算法本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多