山梦 发表于 2024-1-19 20:28:50

蔡勒公式求星期,200年时什么会错呢?

本帖最后由 山梦 于 2024-1-19 21:35 编辑

1582年10月15日后应该都对。但200年,500年时,就有错了。麻烦大佬指正。

<火山程序 类型 = "通常" 版本 = 1 />

方法 Week <公开 静态 类型 = 整数 注释 = "(获取星期,蔡勒公式)">
参数 y <类型 = 整数>
参数 m <类型 = 整数>
参数 d <类型 = 整数>
{
    变量 w <类型 = 整数>
    变量 c <类型 = 整数>
    变量 x <类型 = 整数>
    变量 yy <类型 = 整数>
    变量 mm <类型 = 整数>
    变量 dd <类型 = 整数>
    // 蔡勒公式
    // 当前日期(current)是否早于(或等于)另一个日期对象(start)
    yy = y
    mm = m
    dd = d
    如果真 (m < 3)
    {
      m = m + 12
      y = y - 1
    }

    c = y / 100
    y = y - c * 100
    x = y + y / 4 + c / 4 - 2 * c
    如果 (到时间 (到文本 (yy) + "/" + 到文本 (mm) + "/" + 到文本 (dd), ) < 到时间 ("1582/10/15", ))
    {
      w = 取整 ((x + 13 * (m + 1) / 5 + d + 2) % 7)
    }
    否则
    {
      w = 取整 ((x + 26 * (m + 1) / 10 + d - 1) % 7)
    }

返回 ((w + 7) % 7)

}

--------------------------------------------------
以下为C#代码
--------------------------------------
public bool LeapYear => SolarUtil.IsLeapYear(Year);

      /// <summary>
      /// 星期,0代表周日,1代表周一
      /// </summary>
      public int Week
      {
            get
            {
                var start = new Solar(1582, 10, 15);
                var y = Year;
                var m = Month;
                var d = Day;
                var current = new Solar(y, m, d);
                // 蔡勒公式
                if (m < 3) {
                  m += 12;
                  y--;
                }
                var c = y / 100;
                y = y - c * 100;
                var x = y + y / 4 + c / 4 - 2 * c;
                int w;
                if (current.IsBefore(start)) {
                  w = (x + 13 * (m + 1) / 5 + d + 2) % 7;
                } else {
                  w = (x + 26 * (m + 1) / 10 + d - 1) % 7;
                }
                return (w + 7) % 7;
            }
      }

________________________________________
以下为py代码
-----------------------------------

def getWeek(self):
      """
      获取星期,0代表周日,1代表周一
      :return: 0123456
      """
      start = Solar.fromYmd(1582, 10, 15)
      y = self.__year
      m = self.__month
      d = self.__day
      current = Solar.fromYmd(y, m, d)
      if m < 3:
            m += 12
            y -= 1
      c = int(y / 100)
      y = y - c * 100
      x = y + int(y / 4) + int(c / 4) - 2 * c
      if current.isBefore(start):
            w = (x + int(13 * (m + 1) / 5) + d + 2) % 7
      else:
            w = (x + int(26 * (m + 1) / 10) + d - 1) % 7
      return (w + 7) % 7


页: [1]
查看完整版本: 蔡勒公式求星期,200年时什么会错呢?