Python如何实现阳历转阴历的方法分享
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python如何实现阳历转阴历的方法分享相关的知识,希望对你有一定的参考价值。
参考技术A 1. 如果你想看怎么实现,你可以去看xmltodict这个第三方库,2. 如果你想直接使用,也是去看xnltodict这个库,
3. 总的来说,就是你可以用xmltodict实现,先转换成python标准的dict,再用python自带的json.dumps()转换即可 参考技术B
pip里有一个sxtwl的库。很方便的
pip install sxtwl 就能安装了。
如果是Windows用户,可以使用作者提供的二进制安装包:
传送门
下面是转换的例子
#-*-coding:utf-8-*-import sxtwl
#日历中文索引
ymc = [u"十一", u"十二", u"正", u"二", u"三", u"四", u"五", u"六", u"七", u"八", u"九", u"十" ]
rmc = [u"初一", u"初二", u"初三", u"初四", u"初五", u"初六", u"初七", u"初八", u"初九", u"初十",
u"十一", u"十二", u"十三", u"十四", u"十五", u"十六", u"十七", u"十八", u"十九",
u"二十", u"廿一", u"廿二", u"廿三", u"廿四", u"廿五", u"廿六", u"廿七", u"廿八", u"廿九", u"三十", u"卅一"]
lunar = sxtwl.Lunar() #实例化日历库
#阴历转阳历,如需要计算公元前的,用负数表示,比如-20表示公元前20年
day = lunar.getDayByLunar(2030, 3, 27 , False)
print u"公历:", day.y, u"年", day.m, u"月", day.d, u"日"
if day.Lleap:
print u"阴历:润", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"
else:
print u"阴历:", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"
#同理,阳历转阴历
day = lunar.getDayBySolar(2018, 10, 20)
print u"公历:", day.y, u"年", day.m, u"月", day.d, u"日"
if day.Lleap:
print u"阴历:润", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"
else:
print u"阴历:", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"
#试一下公元前
day = lunar.getDayBySolar(-100, 10, 20)
print u"公历:", day.y, u"年", day.m, u"月", day.d, u"日"
if day.Lleap:
print u"阴历:润", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"
else:
print u"阴历:", ymc[day.Lmc], u"月", rmc[day.Ldi], u"日"
JAVA线程万年历(阳历+阴历+节日+时间)
JAVA线程万年历(阳历+阴历+节日+时间)
package myCalendar;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Calendar;
class Clock extends Canvas implements Runnable
/**
*
*/
private static final long serialVersionUID = 3660124045489727166L;
MainFrame mf;
Thread t;
String time;
public Clock(MainFrame mf)
this.mf=mf;
setSize(280,40);
setBackground(Color.white);
t=new Thread(this); //实例化线程
t.start(); //调用线程
public void run()
while(true)
try
Thread.sleep(1000); //休眠1秒钟
catch(InterruptedException e)
System.out.println("异常");
this.repaint(100);
public void paint(Graphics g)
Font f=new Font("宋体",Font.BOLD,16);
SimpleDateFormat SDF=new SimpleDateFormat("yyyy'年'MM'月'dd'日'HH:mm:ss");//格式化时间显示类型
Calendar now=Calendar.getInstance();
time=SDF.format(now.getTime()); //得到当前日期和时间
g.setFont(f);
g.setColor(Color.black);
g.drawString(time,45,25);
package myCalendar;
import java.awt.Color;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Lunar
private int year;
private int month;
private int day;
private boolean leap;
final static String chineseNumber[] = "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二";
static SimpleDateFormat chineseDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
final static long[] lunarInfo = new long[]
0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,
0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0;
//====== 传回农历 y年的总天数
final private static int yearDays(int y)
int i, sum = 348;
for (i = 0x8000; i > 0x8; i >>= 1)
if ((lunarInfo[y - 1900] & i) != 0) sum += 1;
return (sum + leapDays(y));
//====== 传回农历 y年闰月的天数
final private static int leapDays(int y)
if (leapMonth(y) != 0)
if ((lunarInfo[y - 1900] & 0x10000) != 0)
return 30;
else
return 29;
else
return 0;
//====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
final private static int leapMonth(int y)
return (int) (lunarInfo[y - 1900] & 0xf);
//====== 传回农历 y年m月的总天数
final private static int monthDays(int y, int m)
if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
return 29;
else
return 30;
//====== 传回农历 y年的生肖
final public String animalsYear()
final String[] Animals = new String[]"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪";
return Animals[(year - 4) % 12];
//====== 传入 月日的offset 传回干支, 0=甲子
final private static String cyclicalm(int num)
final String[] Gan = new String[]"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸";
final String[] Zhi = new String[]"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥";
return (Gan[num % 10] + Zhi[num % 12]);
//====== 传入 offset 传回干支, 0=甲子
final public String cyclical()
int num = year - 1900 + 36;
return (cyclicalm(num));
public static String getChinaDayString(int day)
String chineseTen[] = "初", "十", "廿", "卅";
int n = day % 10 == 0 ? 9 : day % 10 - 1;
if (day > 30)
return "";
if (day == 10)
return "初十";
else
return chineseTen[day / 10] + chineseNumber[n];
/** *//**
* 传出y年m月d日对应的农历.
* yearCyl3:农历年与1864的相差数 ?
* monCyl4:从1900年1月31日以来,闰月数
* dayCyl5:与1900年1月31日相差的天数,再加40 ?
* @param cal
* @return
*/
public String getLunarDate(int year_log, int month_log, int day_log)
//@SuppressWarnings("unused")
int yearCyl, monCyl, dayCyl;
int leapMonth = 0;
String nowadays;
Date baseDate = null;
Date nowaday=null;
try
baseDate = chineseDateFormat.parse("1900年1月31日");
catch (ParseException e)
e.printStackTrace(); //To change body of catch statement use Options | File Templates.
nowadays=year_log+"年"+month_log+"月"+day_log+"日";
try
nowaday = chineseDateFormat.parse(nowadays);
catch (ParseException e)
e.printStackTrace(); //To change body of catch statement use Options | File Templates.
//求出和1900年1月31日相差的天数
int offset = (int) ((nowaday.getTime() - baseDate.getTime()) / 86400000L);
dayCyl = offset + 40;
monCyl = 14;
//用offset减去每农历年的天数
// 计算当天是农历第几天
//i最终结果是农历的年份
//offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = 1900; iYear < 10000 && offset > 0; iYear++)
daysOfYear = yearDays(iYear);
offset -= daysOfYear;
monCyl += 12;
if (offset < 0)
offset += daysOfYear;
iYear--;
monCyl -= 12;
//农历年份
year = iYear;
yearCyl = iYear - 1864;
leapMonth = leapMonth(iYear); //闰哪个月,1-12
leap = false;
//用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
int iMonth, daysOfMonth = 0;
for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++)
//闰月
if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap)
--iMonth;
leap = true;
daysOfMonth = leapDays(year);
else
daysOfMonth = monthDays(year, iMonth);
offset -= daysOfMonth;
//解除闰月
if (leap && iMonth == (leapMonth + 1)) leap = false;
if (!leap) monCyl++;
//offset为0时,并且刚才计算的月份是闰月,要校正
if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1)
if (leap)
leap = false;
else
leap = true;
--iMonth;
--monCyl;
//offset小于0时,也要校正
if (offset < 0)
offset += daysOfMonth;
--iMonth;
--monCyl;
month = iMonth;
day = offset + 1;
if(((month)==1)&&day==1)
return "春节";
else if(((month)==1)&&day==15)
return "元宵";
else if(((month)==5)&&day==5)
return "端午";
else if(((month)==8)&&day==15)
return "中秋";
else if(day==1)
return chineseNumber[month - 1] + "月";
else
return getChinaDayString(day);
public String toString()
if(chineseNumber[month - 1]=="一"&&getChinaDayString(day)=="初一")
return "农历"+year + "年";
else if(getChinaDayString(day)=="初一")
return chineseNumber[month - 1] + "月";
else
return getChinaDayString(day);
//return year + "年" + (leap ? "闰" : "") + chineseNumber[month - 1] + "月" + getChinaDayString(day);
package myCalendar;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
class MainFrame extends JFrame
/**
*
*/
private static final long serialVersionUID = 1L;
JPanel panel = new JPanel(new BorderLayout());
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel(new GridLayout(7, 7));
JPanel panel3 = new JPanel();
JLabel[] label = new JLabel[49];
JLabel y_label = new JLabel("年份");
JLabel m_label = new JLabel("月份");
JComboBox com1 = new JComboBox();
JComboBox com2 = new JComboBox();
JButton but1=new JButton("上个月");
JButton but2=new JButton("下个月");
int re_year, re_month;
int x_size, y_size;
String year_num;
Calendar now = Calendar.getInstance(); // 实例化Calendar
MainFrame()
super("万年历");
setSize(600, 700);
x_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
y_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
setLocation((x_size - 300) / 2, (y_size - 350) / 2);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1.add(but1);
panel1.add(y_label);
panel1.add(com1);
panel1.add(m_label);
panel1.add(com2);
panel1.add(but2);
for (int i = 0; i < 49; i++)
label[i] = new JLabel("", JLabel.CENTER);// 将显示的字符设置为居中
panel2.add(label[i]);
panel3.add(new Clock(this));
panel.add(panel1, BorderLayout.NORTH);
panel.add(panel2, BorderLayout.CENTER);
panel.add(panel3, BorderLayout.SOUTH);
panel.setBackground(Color.white);
panel1.setBackground(Color.white);
panel2.setBackground(Color.white);
panel3.setBackground(Color.gray);
Init();
but1.addActionListener(new AnAction());
but2.addActionListener(new AnAction());
com1.addActionListener(new ClockAction());
com2.addActionListener(new ClockAction());
setContentPane(panel);
setVisible(true);
setResizable(false);
class AnAction implements ActionListener
public void actionPerformed(ActionEvent e)
int c_year, c_month,c_week;
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_year = Integer.parseInt(com1.getSelectedItem().toString())-1; // 得到当前所选年份
if(e.getSource()==but1)
if(c_month==0)
c_year=c_year-1;
c_month=11;
else
c_month=c_month-1;
if(e.getSource()==but2)
if(c_month==11)
c_year=c_year+1;
c_month=0;
else
c_month=c_month+1;
com1.setSelectedIndex(c_year);
com2.setSelectedIndex(c_month);
c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_week = use(c_year, c_month); // 调用函数use,得到星期几
Resetday(c_week, c_year, c_month); // 调用函数Resetday
/* class NextAction implements ActionListener
public void actionPerformed(ActionEvent arg0)
int c_year, c_month,c_week;
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份
if(c_month==11)
c_year=c_year+1;
c_month=0;
c_week = use(c_year, c_month); // 调用函数use,得到星期几
Resetday(c_week, c_year, c_month); // 调用函数Resetday
*/
class ClockAction implements ActionListener
public void actionPerformed(ActionEvent arg0)
int c_year, c_month, c_week;
c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_week = use(c_year, c_month); // 调用函数use,得到星期几
Resetday(c_week, c_year, c_month); // 调用函数Resetday
public void Init()
int year, month_num, first_day_num;
String log[] = "日", "一", "二", "三", "四", "五", "六" ;
for (int i = 0; i < 7; i++)
label[i].setText(log[i]);
for (int i = 0; i < 49; i = i + 7)
label[i].setForeground(Color.blue); // 将星期日的日期设置为红色
for (int i = 6; i < 49; i = i + 7)
label[i].setForeground(Color.blue);// 将星期六的日期设置为hong色
for (int i = 1; i < 10000; i++)
com1.addItem("" + i);
for (int i = 1; i < 13; i++)
com2.addItem("" + i);
month_num = (int) (now.get(Calendar.MONTH)); // 得到当前时间的月份
year = (int) (now.get(Calendar.YEAR)); // 得到当前时间的年份
com1.setSelectedIndex(year - 1); // 设置下拉列表显示为当前年???????????
com2.setSelectedIndex(month_num); // 设置下拉列表显示为当前月
first_day_num = use(year, month_num);
Resetday(first_day_num, year, month_num);
public int use(int reyear, int remonth)
int week_num;
now.set(reyear, remonth, 1); // 设置时间为所要查询的年月的第一天
week_num = (int) (now.get(Calendar.DAY_OF_WEEK));// 得到第一天的星期
return week_num;
// @SuppressWarnings("deprecation")
public void Resetday(int week_log, int year_log, int month_log)
int month_day_score; // 存储月份的天数
int count;
Lunar lunar;
int month_day;
String[] LunarDate=new String[49];
month_day_score = 0;
count = 1;
for (int i = 1; i < 49; i ++)
for(int j=0;j<49;j=j+7)
if(i!=j&&i!=j+6)
label[i].setForeground(Color.black);
Date date = new Date(year_log, month_log + 1, 1); // now MONTH是从0开始的, 对于一月第几天来说,DAY_OF_MONTH第一天就是1. 对于一年第几个月来说,MONTH一月份是0,二月份是1...
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, -1); // 前个月
month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 最后一天
month_day=month_day_score;
for (int i = 7; i < 49; i++) // 初始化标签
label[i].setText("");
week_log = week_log + 6; // 将星期数加6,使显示正确
month_day_score = month_day_score + week_log;
lunar=new Lunar();
for(int i=0;i<month_day;i++)
LunarDate[i]=lunar.getLunarDate( year_log, month_log+1, i+1);
for (int i = week_log; i < month_day_score; i++, count++)
if(month_log==9&&count==1)
label[i].setText(count +"国庆" );
label[i].setForeground(Color.red);
else if(month_log==0&&count==1)
label[i].setText(count +"元旦" );
label[i].setForeground(Color.red);
else if(month_log==11&&count==24)
label[i].setText(count +"平安夜" );
label[i].setForeground(Color.red);
else if(month_log==11&&count==25)
label[i].setText(count +"圣诞" );
label[i].setForeground(Color.red);
else if(month_log==1&&count==14)
label[i].setText(count +"情人节" );
label[i].setForeground(Color.red);
else if(month_log==4&&count==1)
label[i].setText(count +"劳动节" );
label[i].setForeground(Color.red);
else if(LunarDate[i-week_log].equals("春节")||LunarDate[i-week_log].equals("元宵")||LunarDate[i-week_log].equals("端午")||LunarDate[i-week_log].equals("中秋"))
label[i].setText(count +LunarDate[i-week_log] );
label[i].setForeground(Color.red);
else
label[i].setText(count +LunarDate[i-week_log] );
public static void main(String[] args)
JFrame.setDefaultLookAndFeelDecorated(true);
new MainFrame();
以上是关于Python如何实现阳历转阴历的方法分享的主要内容,如果未能解决你的问题,请参考以下文章