|
本帖最后由 山梦 于 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
|
|