这里有任何日历吗?我一直在寻找有关如何计算格里高利历中不规则出现的当年假期的信息。通常会发生这种情况,因为假期是基于较旧的农历日历。
我用谷歌搜索了一些令人作呕的事情并取得了一些进展但却无法完成。如果有人用现代语言描述他们的计算的示例代码,我将非常感激。我更喜欢python或其中一种C *语言。
到目前为止我的进展:
达成:
关闭:
import calendar_util as cu # from date utils; no jokes from .br
#
# year = int(sys.argv1) or datetime.now().year
tj = cu.gregorian_to_jd(year, 1, 1) # this year in julian
ti = cu.jd_to_islamic(tj) # this year in islamic cal
rj = cu.islamic_to_jd(ti[0], 9, 1) # first day of ramadan in julian
#
print cu.jd_to_gregorian(rj) # first day of ramadan in greg
# output: (2011, 8, 1) # correct
我在2014年,2016年得到了一天的结果,正如this site所证实的那样,尽管它提到“北美目击”对我的口味有点模糊。希望提高准确性的指针,例如1月1日是否达到某些年度截止日期。伊斯兰教的年龄较短,因此每年早些时候到达。
纳达:
为了SO的功劳,我找到了一个30美元的this book链接,但是宁愿不为几行代码支付和挖掘那么多。在亚马逊的讨论中,它提到例程都在Emacs日历中。但是我从来没有安装Emacs,所以如果它是唯一可用的代码,希望有人可以帮我把它挖出来并简化它,以便给我今年的Ramadan /中国纽约。
不确定它在这里是否有用,但是我已经使用pyephem可以获得太阳和月亮事件。也许它也可以使用。
答案 0 :(得分:4)
即使我没有代码,我也可以提供可能会让您取得一些进展的信息。
首先,Julian Date作为计算月球和月球日期的基础是有意义的,因为它在大地水准面上以SI秒计算。因此,可以容易地将用于预测这些事件之间的SI秒数的公式相关联。 http://en.wikipedia.org/wiki/Julian_day
Lunisolar假日和一般的希伯来日历计划取决于月相和太阳平日的相关性。在希伯来和伊斯兰日历中,这一天从日落开始。因此,如果月亮在日落附近达到100%相位,则可能影响假期何时发生以及日历计划如何进入未来。但是什么时候日落?这不仅取决于经度,还取决于观察的范围。因此,您必须从大地水准面上的特定位置计划阴阳历和假期。 http://en.wikipedia.org/wiki/Jewish_calendar#Principles
这些因素导致使用简化的教会系统,其中有几种在世界上广泛使用,用于复活节日期的“计算”,而不是直接的天文观测。 http://en.wikipedia.org/wiki/Computus
如果您打算在SI秒内无限期地预测假日日期和时间间隔,那么传统伊斯兰日历的要求(包括日落等天文观测定义)将需要与大地水准面上的特定位置相关联。过去或将来。这可能是你提到的“北美目击”评论和未来假日日期错误的原因;如果月相与太阳日的观测是在北美进行的,而不是说麦加,那么日历的计划将大不相同。
预测任何天文星历,以及月球或月球日历事件的一个不可避免和不可预测的因素是地球自转时间的变化。有一个估算这种变化的简单公式,但实际是使用来自极远天体的信号进行测量。 http://en.wikipedia.org/wiki/Leap_second由于这种不确定性,以及某些日历对月相和太阳星历之间相关性的敏感性,这些日历的(遥远的)未来总是有一个视野,过去的日历序列是不可知的。
PyEphem看起来像一个非常酷的包,我会自己检查一下。如果它的内置逻辑不能满足您的需求,那么您将在很长一段时间内研究如何在未来无限期地预测天体事件。这是一种品味:http://en.wikipedia.org/wiki/Precession_of_the_equinoxes#Values
同样,我没有任何具体的代码,但我希望这些信息不会重复您已经知道的内容并对您有所帮助。
答案 1 :(得分:1)
我已经使用现有的库对这两者进行了编码。
这是斋月的代码:
from convertdate import islamic
def ramadan(year):
islamic_year = islamic.from_gregorian(year, 1, 1)[0]
result = islamic.to_gregorian(islamic_year, 9, 1)
if result[0] < year:
result = islamic.to_gregorian(islamic_year+1, 9, 1)
elif result[0] > year:
result = islamic.to_gregorian(islamic_year-1, 9, 1)
return date(*result)
这是农历新年的代码:
from lunardate import LunarDate
_yot = ('Rat', 'Ox', 'Tiger', 'Rabbit', 'Dragon', 'Snake', 'Horse', 'Goat', 'Monkey', 'Rooster', 'Dog', 'Pig')
def year_of_the(year):
yr = (year - 2020) % len(_yot)
return _yot[yr]
def chinese_new_year(year):
"""Returns a tuple of the (date, year_of_the: str)"""
return (LunarDate(year, 1, 1).toSolarDate(), year_of_the(year))
我为convertdate打开了一个增强请求,以添加它们:https://github.com/fitnr/convertdate/issues/24