java - 星期功能不起作用

标签 java algorithm dayofweek

我正在尝试创建一个函数,给定年份 year > 1999它返回一个 0 到 6 的值,其中 Sunday = 0, Monday = 1 ... Saturday = 6对应于 11 月的第一天所在的星期几。因为我知道 2000 年 11 月 1 日是 3(星期三),所以我将其用作 NOV1 .我知道我必须牢记闰年所以我有一个 if有帮助的声明。我不知道为什么超过 2100 年它不能正常工作。求助!

public static int firstOfMonth(int year)
{
  int raw = year - 2000;
  int leapYears = raw / 4;
  int nonLeapYears = 0;
  if ( raw >= 100 )
  {
    nonLeapYears = raw / 100;
    leapYears = leapYears - ( nonLeapYears - ( nonLeapYears / 4 ) );
  }
  else
  {
    nonLeapYears = 0;
  }
  return ((( NOV1 + ( raw * 365 ) - leapYears) ) % 7 );
}

再次,NOV1 = 3

最佳答案

问题的出现似乎是因为您在 return 语句中减去闰年而不是添加闰年。


这样的错误之所以会发生并且很难被注意到,部分原因是周围的代码变得过于复杂。简化代码后更容易看出问题出在哪里。

例如,整个代码块:

int leapYears = raw / 4;
int nonLeapYears = 0;    
if ( raw >= 100 )
  {
    nonLeapYears = raw / 100;
    leapYears = leapYears - ( nonLeapYears - ( nonLeapYears / 4 ) );
  }
  else
  {
    nonLeapYears = 0;
  }

都可以简化为:

int leapYears = int(raw/4) - int(raw/100) + int(raw/400);

那是每四年减去能被 100 整除的年数,但也能被 400 整除的年数除外。有道理吗? 一旦获得了已经过去的闰年数,计算自 2000 年 11 月 1 日以来的天数应该很简单:

365 * raw + leapYears;

如果有闰年,您必须添加尽可能多的额外天数,因为闰年​​有 366 天。因此,您的返回声明应该是:

return ( NOV1 + 365 * raw + leapYears ) % 7;

最后,你应该有这样的东西:

public static int firstOfMonth(int year)
{
    int raw = year - 2000;
    int leapYears = int(raw/4) - int(raw/100) + int(raw/400);
    return ( NOV1 + 365 * raw + leapYears ) % 7;
}

关于java - 星期功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27218087/

相关文章:

javascript - 比较运算符不起作用(Javascript)

algorithm - 有效检查图像的两个像素是否相连

postgresql - 在 Postgresql 中获取 ISO 日期的奇怪结果

java - 在字符串问题中存储 XPath 查询 xml

java - 比较两个不同格式的日期对象

java - 有没有像 ASP.NET MVCs Glimpse 这样的 Java Spring MVC 工具?

c# - 计算两个日期之间一周中每一天的发生次数

java - Spring ReST 返回标准

algorithm - 从一个点径向动画图层网格

PHP - 当周从星期一以外的一天开始时,获取给定周数的第一天