- 浏览: 253217 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
runjia1987:
cpu 100%,是因为读=-1时,没有解注册OP_READ, ...
java nio网络编程的一点心得 -
two_plus:
按照你的例子 服务端变成读循环了...
java nio网络编程的一点心得 -
ilovemyyang:
我也遇到同样的空循环问题,也是百度才找到了的,楼主给力哦
java nio网络编程的一点心得 -
高攀sky:
Python发邮件 -
fobdddf:
fobdddf 写道朋友你好,我试了一下数组的那个例子,反汇编 ...
读《深入理解计算机系统》
实现中主要有两个方法,一个是get_lunar_date,它根据公历返回农历,返回是一个 四元组(year,month,day,leap),leap为True表示返回的月份在闰月,为False时表示不是闰月。另外一个是 get_solar_date,它根据农历返回公历,由于农历存在闰月,可能有一个农历日期对应着两个公历日期,这个方法返回一个数组,如果农历月份为闰 月,这个数组会包含两个公历日期,否则只有一个公历日期。这个方法对日期校验并不十分严格,它允许任意月份的天数为30,严格说来某些月份只有29天,例 如农历2009年10月只有29天,但get_solar_date也可以接收2009年10月30,即 get_solar_date(2009,10,30),它相当于返回农历2009年11月1日的公历日期。另外,严格地说农历2009年5月30号只对应着一个公历日期,因为虽然2009年的5月是闰月,存在两个5月,但只有一个5月有30号,但该程序会返回两个公历日期。
源代码如下:
#!/usr/bin/env python #coding=utf-8 # 存储1901-2099年每年每月的天数,第1位到第13位存储每月(包括闰月共13月)的天数,为1表示该月为30天, # 为0表示该月为29天。第12-15位表示该年闰月的月份,如果为0x0F表示该年没有闰月。 g_lunar_month_days = [ 0xF0EA4, 0xF1D4A, 0x52C94, 0xF0C96, 0xF1536, 0x42AAC, 0xF0AD4, 0xF16B2, 0x22EA4, 0xF0EA4, # 1901-1910 0x6364A, 0xF164A, 0xF1496, 0x52956, 0xF055A, 0xF0AD6, 0x216D2, 0xF1B52, 0x73B24, 0xF1D24, # 1911-1920 0xF1A4A, 0x5349A, 0xF14AC, 0xF056C, 0x42B6A, 0xF0DA8, 0xF1D52, 0x23D24, 0xF1D24, 0x61A4C, # 1921-1930 0xF0A56, 0xF14AE, 0x5256C, 0xF16B4, 0xF0DA8, 0x31D92, 0xF0E92, 0x72D26, 0xF1526, 0xF0A56, # 1931-1940 0x614B6, 0xF155A, 0xF0AD4, 0x436AA, 0xF1748, 0xF1692, 0x23526, 0xF152A, 0x72A5A, 0xF0A6C, # 1941-1950 0xF155A, 0x52B54, 0xF0B64, 0xF1B4A, 0x33A94, 0xF1A94, 0x8152A, 0xF152E, 0xF0AAC, 0x6156A, # 1951-1960 0xF15AA, 0xF0DA4, 0x41D4A, 0xF1D4A, 0xF0C94, 0x3192E, 0xF1536, 0x72AB4, 0xF0AD4, 0xF16D2, # 1961-1970 0x52EA4, 0xF16A4, 0xF164A, 0x42C96, 0xF1496, 0x82956, 0xF055A, 0xF0ADA, 0x616D2, 0xF1B52, # 1971-1980 0xF1B24, 0x43A4A, 0xF1A4A, 0xA349A, 0xF14AC, 0xF056C, 0x60B6A, 0xF0DAA, 0xF1D92, 0x53D24, # 1981-1990 0xF1D24, 0xF1A4C, 0x314AC, 0xF14AE, 0x829AC, 0xF06B4, 0xF0DAA, 0x52D92, 0xF0E92, 0xF0D26, # 1991-2000 0x42A56, 0xF0A56, 0xF14B6, 0x22AB4, 0xF0AD4, 0x736AA, 0xF1748, 0xF1692, 0x53526, 0xF152A, # 2001-2010 0xF0A5A, 0x4155A, 0xF156A, 0x92B54, 0xF0BA4, 0xF1B4A, 0x63A94, 0xF1A94, 0xF192A, 0x42A5C, # 2011-2020 0xF0AAC, 0xF156A, 0x22B64, 0xF0DA4, 0x61D52, 0xF0E4A, 0xF0C96, 0x5192E, 0xF1956, 0xF0AB4, # 2021-2030 0x315AC, 0xF16D2, 0xB2EA4, 0xF16A4, 0xF164A, 0x63496, 0xF1496, 0xF0956, 0x50AB6, 0xF0B5A, # 2031-2040 0xF16D4, 0x236A4, 0xF1B24, 0x73A4A, 0xF1A4A, 0xF14AA, 0x5295A, 0xF096C, 0xF0B6A, 0x31B54, # 2041-2050 0xF1D92, 0x83D24, 0xF1D24, 0xF1A4C, 0x614AC, 0xF14AE, 0xF09AC, 0x40DAA, 0xF0EAA, 0xF0E92, # 2051-2060 0x31D26, 0xF0D26, 0x72A56, 0xF0A56, 0xF14B6, 0x52AB4, 0xF0AD4, 0xF16CA, 0x42E94, 0xF1694, # 2061-2070 0x8352A, 0xF152A, 0xF0A5A, 0x6155A, 0xF156A, 0xF0B54, 0x4174A, 0xF1B4A, 0xF1A94, 0x3392A, # 2071-2080 0xF192C, 0x7329C, 0xF0AAC, 0xF156A, 0x52B64, 0xF0DA4, 0xF1D4A, 0x41C94, 0xF0C96, 0x8192E, # 2081-2090 0xF0956, 0xF0AB6, 0x615AC, 0xF16D4, 0xF0EA4, 0x42E4A, 0xF164A, 0xF1516, 0x22936, # 2090-2099 ] import sys from datetime import datetime, timedelta START_YEAR, END_YEAR = 1901, 1900 + len(g_lunar_month_days) LUNAR_START_DATE, SOLAR_START_DATE = (1901, 1, 1), datetime(1901,2,19) # 1901年正月初一的公历日期为1901/2/19 LUNAR_END_DATE, SOLAR_END_DATE = (2099, 12, 30), datetime(2100,2,18) # 2099年12月30的公历日期是2100/2/8 def date_diff(tm): return (tm - SOLAR_START_DATE).days def get_leap_month(lunar_year): return (g_lunar_month_days[lunar_year-START_YEAR] >> 16) & 0x0F def lunar_month_days(lunar_year, lunar_month): return 29 + ((g_lunar_month_days[lunar_year-START_YEAR] >> lunar_month) & 0x01) def lunar_year_days(year): days = 0 months_day = g_lunar_month_days[year - START_YEAR] for i in range(1, 13 if get_leap_month(year) == 0x0F else 14): day = 29 + ((months_day>>i)&0x01) days += day return days # 根据公历计算农历日期,返回(year,month,day,isLeap) def get_lunar_date(tm): if (tm < SOLAR_START_DATE or tm > SOLAR_END_DATE): raise Exception('out of range') span_days = date_diff(tm) year, month, day = START_YEAR, 1, 1 tmp = lunar_year_days(year) while span_days >= tmp: span_days -= tmp year += 1 tmp = lunar_year_days(year) leap = False tmp = lunar_month_days(year, month) while span_days >= tmp: span_days -= tmp month += 1 tmp = lunar_month_days(year, month) leap_month = get_leap_month(year) if month > leap_month: month -= 1 if month == leap_month: leap = True day += span_days return (year, month, day, leap) # 根据农历计算公历日期,返回一个数组[datetime1, datetime2],如果为闰月,则可能包含两个日期,否则只有一个 def get_solar_date(year, month, day): if not(START_YEAR<=year<=END_YEAR and 1<=month<=12 and 1<=day<=30): raise Exception('out of range') span_days = 0; for y in range(START_YEAR, year): span_days += lunar_year_days(y) leap_month = get_leap_month(year) for m in range(1, month + (month > leap_month)): span_days += lunar_month_days(year, m) span_days += day - 1 if leap_month == month: return [SOLAR_START_DATE + timedelta(span_days), SOLAR_START_DATE + timedelta(span_days + lunar_month_days(year, leap_month))] else: return [SOLAR_START_DATE + timedelta(span_days)] if __name__ == '__main__': import unittest class Test(unittest.TestCase): def test_get_lunar_date_out_of_range(self): self.assertRaises(Exception, get_lunar_date, datetime(1898,12,25)) self.assertRaises(Exception, get_lunar_date, datetime(2100,3,5)) def test_get_lunar_date(self): self.assertEqual((1987, 6, 1, True), get_lunar_date(datetime(1987, 7, 26))) self.assertEqual((1987, 6, 1, False), get_lunar_date(datetime(1987, 6, 26))) self.assertEqual((1950, 5, 12, False), get_lunar_date(datetime(1950, 6, 26))) self.assertEqual((1985, 2, 29, False), get_lunar_date(datetime(1985, 4, 18))) self.assertEqual((2099, 11, 20, False), get_lunar_date(datetime(2099,12,31))) def test_get_solar_date_out_of_range(self): self.assertRaises(Exception, get_solar_date, *(1900,3,5)) self.assertRaises(Exception, get_solar_date, *(2100,3,5)) self.assertRaises(Exception, get_solar_date, *(2009,0,5)) self.assertRaises(Exception, get_solar_date, *(2009,13,5)) self.assertRaises(Exception, get_solar_date, *(2009,3,0)) self.assertRaises(Exception, get_solar_date, *(2009,3,31)) def test_get_solar_date(self): self.assertEqual([datetime(1987,6,26), datetime(1987,7,26)], get_solar_date(1987, 6, 1)) self.assertEqual([datetime(2051,2,10)], get_solar_date(2050, 12, 29)) self.assertEqual([datetime(2009,12,3)], get_solar_date(2009, 10, 17)) self.assertEqual([datetime(2009,5,24), datetime(2009,6,23)], get_solar_date(2009, 5, 1)) # self.assertEqual([datetime(2009,6,22)], get_solar_date(2009, 5, 30)) # 闰5月没有30号 self.assertEqual([datetime(2009,6,6), datetime(2009,7,6)], get_solar_date(2009, 5, 14)) self.assertEqual([datetime(1920,11,20)], get_solar_date(1920,10,11)) self.assertEqual([datetime(1914,11,21)], get_solar_date(1914,10,5)) self.assertEqual([datetime(1916,2,3)], get_solar_date(1916,1,1)) self.assertEqual([datetime(2099,12,31)],get_solar_date(2099,11,20)) self.assertEqual([datetime(2062,4,21)], get_solar_date(2062,3,12)) unittest.main()
发表评论
-
Python模板性能评测
2011-11-28 18:00 5598本篇主要是对django, jinja ... -
Mongodb内嵌文档插入性能评测
2011-11-20 18:03 11423Mongodb作为典型的文档数据库,支持内嵌文档和复杂的查询, ... -
支持通配符的DNS代理
2011-05-05 22:23 6993hosts文件可以手动配置一些域名的IP地址,它的优先级最高, ... -
python变量覆盖陷阱
2011-04-03 21:35 3665我已经好几次碰到这样的错误了,每次碰到都花费我大量的时间,下面 ... -
在App Engine下运行Django 1.2
2011-03-20 22:12 1930我不知道App Engine是从什 ... -
实现简单的Future
2011-02-19 19:38 1616异步调用的困难之处我们不知道它什么时候会返回,通常的解决方法是 ... -
创建简单声明式python对象模型
2011-02-19 12:27 2735创建简单python声明式对象模型 要创建一个简单的Auth ... -
用RestrictedPython创建Python Sandbox
2011-02-13 17:35 2992众所周知在Python下可以 ... -
wxpython中工作线程与主线程交互
2011-01-15 23:56 6077在wxpython中,像其它GUI ... -
Python下Base64编码
2010-12-04 12:53 2597在Python下有Base64编码的库,可直接用,我自己写了个 ... -
Python中用MetaClass实现委托、不可变集合
2010-09-13 16:01 5326委托(delegate)是许多设计模式(如Decorator, ... -
用编程语言作数据库测试的配置
2010-09-11 11:25 1316在上一篇博客:django, mo ... -
django, mongodb与测试
2010-09-11 10:05 3313在django下很容易写测试,只需要继承DjangoTestC ... -
一个简单的Form向导实现
2010-06-20 18:42 1365Django的contrib中带了个FormWizard,但是 ... -
再一个用于调试Django模板的标签
2010-06-15 17:42 1851主要用于在Html中递归输出对象的属性,这对调试Django相 ... -
几个用于调试Django模板的标签
2010-06-15 17:18 4591Django模板有诸多限制,例如不能调用方法,不能执行任意的P ... -
探索Python下的property, classmethod, staticmethod的实现
2010-05-30 21:10 4110Python有几个内置方法poperty, classmeth ... -
Python发邮件
2010-03-27 11:25 2373下面的代码的作用是将电子书作为附件发送到163邮箱。 ...
相关推荐
使用python进行公历和农历的转换的第三方库
在Python编程中,转换公历日期到农历日期是一项常见的任务,尤其在中国文化背景下,农历日期在许多节日和传统活动中占有重要地位。为了实现这个功能,我们可以利用Python的第三方库,如`pandas`、`numpy`,以及专门...
公历(阳历) 农历(阴历)转换,支持时间段从 1900-2100 如果需要更长的时间段,利用 generate.htm 生成的数据即可。 支持各种编程语言 C#,java,Objective-C,php,Python,javascript(nodejs),C/C++,ruby,swift,golang 等...
- 在Python中,可以使用第三方库如`lunarcalendar`或`chinese-calendar`来实现公农历转换。例如,`lunarcalendar`库提供了`lunar2gregorian`和`gregorian2lunar`函数。 - 如果不使用库,可以自定义算法,通过查找...
5. **编程语言选择**:公历到农历的转换可以用多种编程语言实现,如Python、Java、C++等,每种语言都有相应的日期处理库,如Python的`pandas`和`lunarcalendar`库,Java的`java.time`包等。 6. **错误处理**:在...
本项目旨在介绍如何使用Python编写一个万年历程序,不仅包含公历日期,还囊括了农历以及中国传统节气等功能。这个项目适合对Python编程有一定基础,并希望提升到高级应用层面的开发者。 首先,我们来分析项目中的...
阴阳历转换是中华文化中常见的日历转换问题,因为中国传统的农历(阴历)与国际通用的公历(阳历)之间存在差异。源码的实现可以帮助开发者理解和应用这类转换。 首先,我们要理解阴阳历的特点。阳历,也就是公历,...
2. **农历算法**:农历,也称为阴历,是一种根据月亮的相位来计算日期的系统,与公历(阳历)主要依据太阳运行周期不同。农历算法比较复杂,涉及到月相、闰月和节气等因素。公历到农历的转换通常包括以下几个步骤:...
本文将深入探讨如何将公历(阳历)转换为农历,这是一个在中国和其他东亚国家常用的日期系统。我们将基于提供的日历模块代码进行讨论,并解释其核心算法和实现过程。 首先,公历是一种国际通用的日期系统,基于...
在信息技术领域,日期和时间的处理是不可或缺的一部分,尤其是在中国,公历与农历的转换尤为重要。公历,即格里高利历,是国际上广泛使用的阳历;而农历,又称为阴历,是中国传统的时间计算体系,与节气、节日密切...
如Python的`pandas`和`python-lunar-calendar`,Java的`java.util.Calendar`和第三方库`lunardate`,JavaScript的`moment.js`和`chinese-calendar`等,它们通常已经实现了公历和农历的转换函数。 5. **前端展示**:...
该项目是一款基于Python开发的多功能日历与农历转换工具源码,包含63个文件,涵盖58个Python源文件、3个Markdown文件、1个Git忽略文件和1个LICENSE文件。它集成了公历、农历(阴历、老黄历)、佛历、道历等多种历法...
农历与公历之间的转换涉及到复杂的算法,这些库已经封装好了这些算法,我们只需要调用相应函数即可。对于节气,可以使用农历库提供的节气计算方法,根据日期获取对应的节气信息。 在设计UI界面时,我们需要考虑布局...
公历与农历转换是计算机程序设计中的一个常见需求,尤其在中国和东亚地区,人们在日常生活中经常需要在两种历法之间进行换算。这个“详细的公农历转换1.0.rar”压缩包文件很可能是提供了一个实现这一功能的软件或者...
2. **公历与农历转换算法**:转换过程涉及到农历和公历之间的转换算法,这通常需要一定的数学和天文学知识。例如,农历的月相和节气会影响到每个月的长度,而公历则是基于格里高利历。 3. **用户界面设计**:为了让...
在IT行业中,日期和时间处理是一项基础且重要的任务,尤其在中国,由于同时使用公历(阳历)和农历(阴历),开发相关的日历转换和节日查询功能具有很高的实用价值。本文将深入探讨如何实现公历与农历之间的相互转化...
在IT领域,日期和时间的处理是至关重要的部分,尤其在中国,我们经常需要在公历(阳历)和农历(阴历)之间进行转换。公历是国际通用的日历系统,而农历则更加符合中国的传统习俗,如节日、节气等。本主题将深入探讨...
本文将详细介绍如何使用Python语言实现公历到农历的转换,并对涉及的关键技术点进行深入剖析。 #### 二、农历算法原理 农历,又称阴历,是一种基于月亮周期的日历系统。农历的一个月大约为29.53059天,这与地球绕...
1. **农历转换**:在Python中,实现农历和公历的转换是农历库的基本功能。例如,用户可能需要将一个公历日期(如2022年1月1日)转换为对应的农历日期(如壬子年腊月初九)。通过“borax”或其他类似的库,我们可以...
搜索了好几个python实现的万年历多有部分时间有问题,好多是来自这个代码: 复制代码 代码如下:#!/usr/bin/env python# -*- coding: utf-8 -*-”’Usage: ccal Month [4-Digit-Year] or: ccal 4-Digit-Year Month...