递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 1883|回复: 0
打印 上一主题 下一主题

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

[复制链接]

37

主题

578

帖子

2825

积分

金牌会员

Rank: 6Rank: 6

积分
2825
跳转到指定楼层
楼主
发表于 2024-1-19 20:28:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 山梦 于 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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-13 14:42 , Processed in 0.084990 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表