日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python公历转农历_Python如何实现阳历转阴历的方法分享

發布時間:2024/9/30 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python公历转农历_Python如何实现阳历转阴历的方法分享 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章主要介紹了Python實現公歷(陽歷)轉農歷(陰歷)的方法,涉及農歷算法原理及Python日期運算相關操作技巧,需要的朋友可以參考下

本文實例講述了Python實現公歷(陽歷)轉農歷(陰歷)的方法。分享給大家供大家參考,具體如下:

兩個要點:

1、公歷轉農歷用了查表法(第126行)

2、節氣用了天文法?(第176行)

運行圖(背景是hao123萬年歷)

源代碼:

# lunar.py

# 2015/02/27 羅兵

import datetime

class Lunar(object):

#******************************************************************************

# 下面為陰歷計算所需的數據,為節省存儲空間,所以采用下面比較變態的存儲方法.

#******************************************************************************

#數組g_lunar_month_day存入陰歷1901年到2050年每年中的月天數信息,

#陰歷每月只能是29或30天,一年用12(或13)個二進制位表示,對應位為1表30天,否則為29天

g_lunar_month_day = [

0x4ae0, 0xa570, 0x5268, 0xd260, 0xd950, 0x6aa8, 0x56a0, 0x9ad0, 0x4ae8, 0x4ae0, #1910

0xa4d8, 0xa4d0, 0xd250, 0xd548, 0xb550, 0x56a0, 0x96d0, 0x95b0, 0x49b8, 0x49b0, #1920

0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada8, 0x2b60, 0x9570, 0x4978, 0x4970, 0x64b0, #1930

0xd4a0, 0xea50, 0x6d48, 0x5ad0, 0x2b60, 0x9370, 0x92e0, 0xc968, 0xc950, 0xd4a0, #1940

0xda50, 0xb550, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, 0xb4a8, 0x6ca0, #1950

0xb550, 0x55a8, 0x4da0, 0xa5b0, 0x52b8, 0x52b0, 0xa950, 0xe950, 0x6aa0, 0xad50, #1960

0xab50, 0x4b60, 0xa570, 0xa570, 0x5260, 0xe930, 0xd950, 0x5aa8, 0x56a0, 0x96d0, #1970

0x4ae8, 0x4ad0, 0xa4d0, 0xd268, 0xd250, 0xd528, 0xb540, 0xb6a0, 0x96d0, 0x95b0, #1980

0x49b0, 0xa4b8, 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada0, 0xab60, 0x9370, 0x4978, #1990

0x4970, 0x64b0, 0x6a50, 0xea50, 0x6b28, 0x5ac0, 0xab60, 0x9368, 0x92e0, 0xc960, #2000

0xd4a8, 0xd4a0, 0xda50, 0x5aa8, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, #2010

0xb4a0, 0xb550, 0xb550, 0x55a8, 0x4ba0, 0xa5b0, 0x52b8, 0x52b0, 0xa930, 0x74a8, #2020

0x6aa0, 0xad50, 0x4da8, 0x4b60, 0x9570, 0xa4e0, 0xd260, 0xe930, 0xd530, 0x5aa0, #2030

0x6b50, 0x96d0, 0x4ae8, 0x4ad0, 0xa4d0, 0xd258, 0xd250, 0xd520, 0xdaa0, 0xb5a0, #2040

0x56d0, 0x4ad8, 0x49b0, 0xa4b8, 0xa4b0, 0xaa50, 0xb528, 0x6d20, 0xada0, 0x55b0, #2050

]

#數組gLanarMonth存放陰歷1901年到2050年閏月的月份,如沒有則為0,每字節存兩年

g_lunar_month = [

0x00, 0x50, 0x04, 0x00, 0x20, #1910

0x60, 0x05, 0x00, 0x20, 0x70, #1920

0x05, 0x00, 0x40, 0x02, 0x06, #1930

0x00, 0x50, 0x03, 0x07, 0x00, #1940

0x60, 0x04, 0x00, 0x20, 0x70, #1950

0x05, 0x00, 0x30, 0x80, 0x06, #1960

0x00, 0x40, 0x03, 0x07, 0x00, #1970

0x50, 0x04, 0x08, 0x00, 0x60, #1980

0x04, 0x0a, 0x00, 0x60, 0x05, #1990

0x00, 0x30, 0x80, 0x05, 0x00, #2000

0x40, 0x02, 0x07, 0x00, 0x50, #2010

0x04, 0x09, 0x00, 0x60, 0x04, #2020

0x00, 0x20, 0x60, 0x05, 0x00, #2030

0x30, 0xb0, 0x06, 0x00, 0x50, #2040

0x02, 0x07, 0x00, 0x50, 0x03 #2050

]

START_YEAR = 1901

# 天干

gan = '甲乙丙丁戊己庚辛壬癸'

# 地支

zhi = '子丑寅卯辰巳午未申酉戌亥'

# 生肖

xiao = '鼠牛虎兔龍蛇馬羊猴雞狗豬'

# 月份

lm = '正二三四五六七八九十冬臘'

# 日份

ld = '初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十'

# 節氣

jie = '小寒大寒立春雨水驚蟄春分清明谷雨立夏小滿芒種夏至小暑大暑立秋處暑白露秋分寒露霜降立冬小雪大雪冬至'

def __init__(self, dt = None):

'''初始化:參數為datetime.datetime類實例,默認當前時間'''

self.localtime = dt if dt else datetime.datetime.today()

def sx_year(self): # 返回生肖年

ct = self.localtime #取當前時間

year = self.ln_year() - 3 - 1 # 農歷年份減3 (說明:補減1)

year = year % 12 # 模12,得到地支數

return self.xiao[year]

def gz_year(self): # 返回干支紀年

ct = self.localtime #取當前時間

year = self.ln_year() - 3 - 1 # 農歷年份減3 (說明:補減1)

G = year % 10 # 模10,得到天干數

Z = year % 12 # 模12,得到地支數

return self.gan[G] + self.zhi[Z]

def gz_month(self): # 返回干支紀月(未實現)

pass

def gz_day(self): # 返回干支紀日

ct = self.localtime #取當前時間

C = ct.year // 100 #取世紀數,減一

y = ct.year % 100 #取年份后兩位(若為1月、2月則當前年份減一)

y = y - 1 if ct.month == 1 or ct.month == 2 else y

M = ct.month #取月份(若為1月、2月則分別按13、14來計算)

M = M + 12 if ct.month == 1 or ct.month == 2 else M

d = ct.day #取日數

i = 0 if ct.month % 2 == 1 else 6 #取i (奇數月i=0,偶數月i=6)

#下面兩個是網上的公式

# http://baike.baidu.com/link?url=MbTKmhrTHTOAz735gi37tEtwd29zqE9GJ92cZQZd0X8uFO5XgmyMKQru6aetzcGadqekzKd3nZHVS99rewya6q

# 計算干(說明:補減1)

G = 4 * C + C // 4 + 5 * y + y // 4 + 3 * (M + 1) // 5 + d - 3 - 1

G = G % 10

# 計算支(說明:補減1)

Z = 8 * C + C // 4 + 5 * y + y // 4 + 3 * (M + 1) // 5 + d + 7 + i - 1

Z = Z % 12

#返回 干支紀日

return self.gan[G] + self.zhi[Z]

def gz_hour(self): # 返回干支紀時(時辰)

ct = self.localtime #取當前時間

#計算支

Z = round((ct.hour/2) + 0.1) % 12 # 之所以加0.1是因為round的bug!!

#返回 干支紀時(時辰)

return self.zhi[Z]

def ln_year(self): # 返回農歷年

year, _, _ = self.ln_date()

return year

def ln_month(self): # 返回農歷月

_, month, _ = self.ln_date()

return month

def ln_day(self): # 返回農歷日

_, _, day = self.ln_date()

return day

def ln_date(self): # 返回農歷日期整數元組(年、月、日)(查表法)

delta_days = self._date_diff()

#陽歷1901年2月19日為陰歷1901年正月初一

#陽歷1901年1月1日到2月19日共有49天

if (delta_days < 49):

year = self.START_YEAR - 1

if (delta_days <19):

month = 11;

day = 11 + delta_days

else:

month = 12;

day = delta_days - 18

return (year, month, day)

#下面從陰歷1901年正月初一算起

delta_days -= 49

year, month, day = self.START_YEAR, 1, 1

#計算年

tmp = self._lunar_year_days(year)

while delta_days >= tmp:

delta_days -= tmp

year += 1

tmp = self._lunar_year_days(year)

#計算月

(foo, tmp) = self._lunar_month_days(year, month)

while delta_days >= tmp:

delta_days -= tmp

if (month == self._get_leap_month(year)):

(tmp, foo) = self._lunar_month_days(year, month)

if (delta_days < tmp):

return (0, 0, 0)

return (year, month, delta_days+1)

delta_days -= tmp

month += 1

(foo, tmp) = self._lunar_month_days(year, month)

#計算日

day += delta_days

return (year, month, day)

def ln_date_str(self):# 返回農歷日期字符串,形如:農歷正月初九

_, month, day = self.ln_date()

return '農歷{}月{}'.format(self.lm[month-1], self.ld[(day-1)*2:day*2])

def ln_jie(self): # 返回農歷節氣

ct = self.localtime #取當前時間

year = ct.year

for i in range(24):

#因為兩個都是浮點數,不能用相等表示

delta = self._julian_day() - self._julian_day_of_ln_jie(year, i)

if -.5 <= delta <= .5:

return self.jie[i*2:(i+1)*2]

return ''

#顯示日歷

def calendar(self):

pass

#######################################################

# 下面皆為私有函數

#######################################################

def _date_diff(self):

'''返回基于1901/01/01日差數'''

return (self.localtime - datetime.datetime(1901, 1, 1)).days

def _get_leap_month(self, lunar_year):

flag = self.g_lunar_month[(lunar_year - self.START_YEAR) // 2]

if (lunar_year - self.START_YEAR) % 2:

return flag & 0x0f

else:

return flag >> 4

def _lunar_month_days(self, lunar_year, lunar_month):

if (lunar_year < self.START_YEAR):

return 30

high, low = 0, 29

iBit = 16 - lunar_month;

if (lunar_month > self._get_leap_month(lunar_year) and self._get_leap_month(lunar_year)):

iBit -= 1

if (self.g_lunar_month_day[lunar_year - self.START_YEAR] & (1 << iBit)):

low += 1

if (lunar_month == self._get_leap_month(lunar_year)):

if (self.g_lunar_month_day[lunar_year - self.START_YEAR] & (1 << (iBit -1))):

high = 30

else:

high = 29

return (high, low)

def _lunar_year_days(self, year):

days = 0

for i in range(1, 13):

(high, low) = self._lunar_month_days(year, i)

days += high

days += low

return days

# 返回指定公歷日期的儒略日

def _julian_day(self):

ct = self.localtime #取當前時間

year = ct.year

month = ct.month

day = ct.day

if month <= 2:

month += 12

year -= 1

B = year / 100

B = 2 - B + year / 400

dd = day + 0.5000115740 #本日12:00后才是儒略日的開始(過一秒鐘)*/

return int(365.25 * (year + 4716) + 0.01) + int(30.60001 * (month + 1)) + dd + B - 1524.5

# 返回指定年份的節氣的儒略日數

def _julian_day_of_ln_jie(self, year, st):

s_stAccInfo =[

0.00, 1272494.40, 2548020.60, 3830143.80, 5120226.60, 6420865.80,

7732018.80, 9055272.60, 10388958.00, 11733065.40, 13084292.40, 14441592.00,

15800560.80, 17159347.20, 18513766.20, 19862002.20, 21201005.40, 22529659.80,

23846845.20, 25152606.00, 26447687.40, 27733451.40, 29011921.20, 30285477.60]

#已知1900年小寒時刻為1月6日02:05:00

base1900_SlightColdJD = 2415025.5868055555

if (st < 0) or (st > 24):

return 0.0

stJd = 365.24219878 * (year - 1900) + s_stAccInfo[st] / 86400.0

return base1900_SlightColdJD + stJd

# 測試

def test(ct=None):

ln = Lunar(ct)

print('公歷 {} 北京時間 {}'.format(ln.localtime.date(), ln.localtime.time()))

print('{} 【{}】 {}年 {}日 {}時'.format(ln.ln_date_str(), ln.gz_year(), ln.sx_year(), ln.gz_day(), ln.gz_hour()))

print('節氣:{}'.format(ln.ln_jie()))

if __name__ == '__main__':

ct = datetime.datetime(2015,2,19,13,0,15)

test(ct)

總結

以上是生活随笔為你收集整理的python公历转农历_Python如何实现阳历转阴历的方法分享的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本h漫在线观看 | 金8天国av | 91中文字幕永久在线 | 久久久久人妻一区二区三区 | 精品香蕉一区二区三区 | av片在线看 | 国产精品资源在线观看 | 肉色欧美久久久久久久免费看 | 精品一久久 | 综合在线亚洲 | 91资源在线视频 | 欧美在线一二三区 | www.99av | 在线观看国产日韩 | 在线免费观看污 | 日韩av一区二区三区在线 | 伦理欧美 | 免费观看黄色的网站 | 热精品 | 日韩大片免费观看 | 欧美做受xxxxxⅹ性视频 | 91理论片午午伦夜理片久久 | 麻豆chinese极品少妇 | 男人在线视频 | 欧美日韩精品在线播放 | 日韩免费av一区 | 黑人玩弄人妻一区二区三区免费看 | 五月婷婷六月天 | 亚洲视频在线免费 | 色涩视频在线观看 | 国产一区二区自拍视频 | 538精品一线 | 在线免费观看黄网 | 奇米狠狠去啦 | 国产激情久久久久久熟女老人av | r级无码视频在线观看 | 成年人免费在线观看视频网站 | 国产成人无码网站 | 亚洲天堂影院在线观看 | 国产一级视频在线观看 | 日韩一区二区三区久久 | 久久国产色 | 亚洲一区二区三区四区五区午夜 | 欧美黄色成人 | 国产精品国产三级国产aⅴ下载 | 国产一区欧美日韩 | 亚洲资源网 | 国产三级视频在线 | 国产精品一区二区在线看 | 日韩一区高清 | 伊人情人综合网 | 搞中出| 大乳村妇的性需求 | 自拍偷拍p | 亚洲精品一二三四区 | 久久99国产精品视频 | jizz高潮| 天堂色区 | 国产一区二区在线免费观看视频 | 午夜福利电影一区二区 | 蜜臀av免费一区二区三区水牛 | 一本色道久久88加勒比—综合 | 欧美精品一级 | 久操资源网 | 国产无遮挡免费 | 色悠久久综合 | 欧美αv| 免费精品久久 | 精品一区91 | 黄色aaa大片| 亚洲熟女乱色一区二区三区久久久 | 欧美视频亚洲 | 在线观看波多野结衣 | 日本乱轮视频 | 久久久国产亚洲 | 午夜日韩av | 日本a级网站 | 久操亚洲| 亚洲不卡在线视频 | 亚洲一区 视频 | 麻豆av免费看 | 国产精品视频免费观看 | 日韩乱码人妻无码中文字幕 | 得得的爱在线视频 | 东方成人av| 欧美色99 | 又色又爽又高潮免费视频国产 | 五月天丁香激情 | 三级a毛片 | 色交视频 | 亚洲一区二区三区在线视频 | 桃色视频 | 免费av网站观看 | 超碰日日夜夜 | 人人爽人人爽人人片 | 日日狠狠久久偷偷四色综合免费 | 亚洲熟妇av乱码在线观看 | 日韩无码电影 | 国产高清成人 |