万年历阴历阳历转换

万年历阴历阳历转换,第1张

Calendar JAVA 这个JAVA日历用处很多,好好看看这个很有好处我们java用的复杂的时间 *** 作,一般都用这个

Java 本身提供了对 "Gregorian Calendar" 规则的实现。我们从 CalendargetInstance() 中所获得的实例就是一个 "GreogrianCalendar" 对象(与您通过 new GregorianCalendar() 获得的结果一致)。

下面的代码可以证明这一点:

import javaio;

import javautil;

public class WhatIsCalendar

{

public static void main(String[] args) {

Calendar calendar = CalendargetInstance();

if (calendar instanceof GregorianCalendar)

Systemoutprintln("It is an instance of GregorianCalendar"t;

}

}

Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。

我们也可以自己的 Calendar 实现类,然后将它作为 Calendar 对象返回(面向对象的特性)。在 IBM alphaWorks 上,IBM 的开发人员实现了多种日历(>

农历计算,百度的计算比较准确,包括黄历禁忌计算都比较准确,而其他的一些网站,你可以对比下,基本上农历要是能准确就算不错了,一般是闰月就有问题,年头年尾也有问题。

一般是JS实现的,很少有Java版本的,我观摩了网上N多Java版本的,基本都有问题,所以下定决心,翻译了一下Javascript成Java,故得出这个接口。

现在,我们网站采用微服务的方式提供出来,响应效率高,可以达到不限制次数。关键是免费的,而且提供JSON方式返回。

接口返回的数据很全面,如: 农历 、 黄历 、 禁忌 、 星期 、 生肖 、 当月的节气 、 是否闰月 、 是不是大月 等,具体自己体会。

参数说明:格式为 yyyy-MM-dd ,可以不传参,默认为当天,Get请求即可。

农历查询 演示

我测试一下请求当天农历查询,链接为: >

你可以用一份用于C语言的数据得到,Java和C语言有相似处,数据也是可以通用的。

我这里有一个数据提取工具,可以提取范围从公元1600年到公元6400年之间的四千八百年之间的任意年份区间的数据,非常好用,算法也有源代码。

//农历月份信息。一年用3个字节表示

//+-------------------------------------------------------------------------+

//| 第23位 |        第22-17位       |  第16-13位 |         第12-0位         |

//|--------+------------------------+------------+--------------------------|

//|  保留  | 农历正月初一的年内序数 |    闰月    | 一个比特对应一个月份大小 |

//+-------------------------------------------------------------------------+

//月份大小数据是月份小的在低位,月份大的在高位,即正月在最低位。

//以1900年为例,3个字节的数据展开成二进制位:

//  0       011110        1000                     1 0 1 1 0 1 1 0 1 0 0 1 0

//保留  1月31日(春节)  闰八月   从左往右依次十二月,十一月……闰八月、八月、七月……正月的天数

//农历月份对应的位为0,表示这个月为29天(小月),为1表示有30天(大月)。

0x58,0x0B,0xA5,0x42,0x0B,0x49,0x2C,0x5A,0x93,0x52,0x0A,0x95,0x3D,0x35,0x2D, //1600-1604

 0x60,0x05,0x56,0x4A,0x0A,0xB5,0x36,0xD5,0xAA,0x5C,0x05,0xD2,0x44,0x0D,0xA5, //1605-1609

 0x30,0x7D,0x4A,0x56,0x0D,0x4A,0x41,0x6A,0x95,0x62,0x0A,0x97,0x4E,0x05,0x56, //1610-1614

 0x39,0x0A,0xB5,0x5E,0x0A,0xD9,0x48,0x06,0xD2,0x32,0x8E,0xA5,0x58,0x0F,0x25, //1615-1619

 0x44,0x06,0x4A,0x2A,0x4C,0x97,0x50,0x0A,0xAB,0x3D,0x55,0x5A,0x62,0x05,0x6A, //1620-1624

 0x4A,0x0B,0x69,0x36,0xD7,0x52,0x5C,0x07,0x92,0x46,0x0B,0x25,0x2E,0x96,0x4B, //1625-1629

 ……

你用用看吧,应该能用的。

/

@(#)AidyCalenderjava

@author

@version 100 2008/7/19

/

import javaawt;

import javaawtevent;

import javalangStringBuffer;

import javaxswing;

import javautil;

import javaxswingTimer;

import javaxswingborder;

public class AidyCalender extends JFrame implements ActionListener,ItemListener{

Date date = new Date();

private GregorianCalendar gregorianCalendar = new GregorianCalendar();

//定义中英文字符数组存储星期信息,用于转换显示

private String[] stringWeekEn = new String[] { "SUN", "MON", "TUE", "WED",

"THU", "FRI", "SAT" };

private String[] stringWeekCn = new String[] { "星期日", "星期一", "星期二", "星期三",

"星期四", "星期五", "星期六" };

//定义存储月份的信息数组,用于转换显示方示

private String[] stringMonthEn = new String[] { "Jan", "Feb", "Mar", "Apr",

"May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec" };

private String[] stringMonthCn = {"一月","二月","三月","四月","五月","六月",

"七月","八月","九月","十月","十一月","十二月"};

private String[] sysNowTime = new String[6];//sysNowTime 用于存储系统时间的变量

private String[] sysRunTime = new String[6];

private JLabel []labelWeek = new JLabel[7];

private JLabel []labelDay = new JLabel[42];

private JLabel labelTime = new JLabel();

private JPanel panel1 = new JPanel();

private JPanel panel2 = new JPanel();

private JPanel panel3 = new JPanel();

private JComboBox combo1 = new JComboBox();

private JComboBox combo2 = new JComboBox();

private JButton buttonToday = new JButton();

private Border border = BorderFactorycreateRaisedBevelBorder();

private Border border1 = BorderFactorycreateLineBorder(Colorcyan,3);

public AidyCalender(String title) {

super(title);

for (int y = 1900; y < 2101; y++) {

combo1addItem(" " + new Integer(y)toString()+"年");

}

for (int m = 0;m<12;m++){

combo2addItem(" "+stringMonthCn[m]);

}

buttonTodaysetText("今 天");

setLayout(new FlowLayout());

add(panel1);

add(panel2);

add(panel3);

panel1setLayout(new GridLayout(1,3,10,0));

panel1add(combo1);

combo1addItemListener(this);

panel1add(combo2);

combo2addItemListener(this);

panel1add(buttonToday);

buttonTodayaddActionListener(this);

labelTimesetFont(new Font("宋体",FontPLAIN,16));

labelTimesetForeground(ColorMAGENTA);

panel1add(labelTime);

Timer time = new Timer(1000,new TimerListener());

timeaddActionListener(new TimerListener());

//timesetRepeats(true);

timestart();

//labelTimeaddAncestorListener(new TimerListener());

panel2setLayout(new GridLayout(7,7,0,10));

panel2setBackground(Colorwhite);

for(int i=0;i<7;i++){

labelWeek[i] = new JLabel();

labelWeek[i]setHorizontalAlignment(0);

if(i==0||i==6){

labelWeek[i]setBackground(Colorblue);

labelWeek[i]setForeground(ColorRED);

labelWeek[i]setFont(new Font("黑体",FontBOLD,14));

}

else{

labelWeek[i]setForeground(ColorBLACK);

labelWeek[i]setFont(new Font("新宋体",FontPLAIN,14));

}

labelWeek[i]setText(stringWeekCn[i]);

panel2add(labelWeek[i]);

}

for(int i= 0;i<42;i++){

labelDay[i] = new JLabel();

labelDay[i]setHorizontalAlignment(0);

labelDay[i]setText("");

panel2add(labelDay[i]);

}

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

Systemexit(0);

}

});

setSize(300,300);

setBounds(250, 200, 400, 360);

setVisible(true);

setResizable(false);

setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

getSysDate();

setNowDate();

}

public void actionPerformed(ActionEvent ae){

if(aegetSource()==buttonToday){

setNowDate();

}

}

public void itemStateChanged(ItemEvent aa){

setChangeDate();

}

public int turnWeek(String week){

int i;

for(i=0;i<7;i++)

if(weekequalsIgnoreCase(stringWeekEn[i]))

break;

return i;

}

public int turnMonth(String month){

/

int turnMonth(String month)

@month 系统日期中的月,诸如Jan\Feb

@return int

返回一个整数值,用于寻找stringMonthCn[]数组中对应的中文月份

/

int i;

for(i=0;i<12;i++)

if(monthequalsIgnoreCase(stringMonthEn[i]))

break;

return i;

}

/

setNowDate()

设置当前系统日期

/

public void setNowDate(){

setSysDate(getNowYear(),getNowMonth());

getSysRunDate();

setDateNull();

combo1setSelectedIndex(getShowYear() - 1900);

combo2setSelectedIndex(getShowMonth());

setDays(getMonthDays(getNowYear(),getNowMonth()),getInitWeek(sysRunTime[0]),getNowDay());

//labelTimesetText(sysNowTime[3]);

//labelTimesetHorizontalAlignment(0);

}

/Integer getShowYear()

获取组合框中应该显示的年份

/

public void setSysDate(int year,int month){

gregorianCalendarset(year,month,1);

}

public void setDateNull(){

for(int i=0;i<42;i++){

labelDay[i]setText("");

}

}

public void setChangeDate(){

setSysDate(getComboYear(),getComboMonth());

getSysRunDate();

setDateNull();

setDays(getMonthDays(getComboYear(),getComboMonth()),getInitWeek(sysRunTime[0]),-1);

}

public int getMonthDays(int year, int month) {

/

返回所选年月的天数,因为数组中的数值从0开始,所以3\5\8\10分别代表4\6\9\11几个小月

而1代表2月,经过是否为闰年判断,选择返回28或29天

其余月份为大月,返回31天

/

switch (month) {

case 3:

case 5:

case 8:

case 10:

return 30;//小月返回30天

case 1:

if (gregorianCalendarisLeapYear(year)) {

//isLeapYear(year)确定当前纪元中的指定年份是否为闰年。

return 29;

} else {

return 28;

}//闰年的二月返回29天,平年返回28天

default:

return 31;

//大月返回31天

}

}

/

int getComboYear()

获取组合框中的年份

/

public void getSysDate(){

date = gregorianCalendargetTime();

sysNowTime = (datetoString())split(" ");

}

public void getSysRunDate(){

date = gregorianCalendargetTime();

sysRunTime = (datetoString())split(" ");

}

public int getComboYear(){

return combo1getSelectedIndex()+1900;

}

/

int getComboMonth()

获取月组合框中的整数值,

/

public int getComboMonth(){

return combo2getSelectedIndex();

}

public int getInitWeek(String initWeek){

/

getWeekNow(String initWeek)

@para nowWeek 系统日期中的星期

返回当月中的1号是从星期几开始

/

int nowWeek = 0 ;

for(int i = 0;i<7;i++){

if(initWeekequalsIgnoreCase(stringWeekEn[i])){

nowWeek = i;

break;

}

}

return nowWeek;

}

public int getNowYear(){

return IntegerparseInt(sysNowTime[5]);

}

public int getNowMonth(){

int nowMonth=0;

for(int i=0;i<12;i++){

if(sysNowTime[1]equalsIgnoreCase(stringMonthEn[i]));

nowMonth=i;

break;

}

return nowMonth;

}

public int getNowDay(){

return IntegerparseInt(sysNowTime[2]);

}

public Integer getShowYear(){

return IntegerparseInt(sysNowTime[5]);

}

public Integer getShowMonth(){

/

Integer getShowMonth()

获取在组给框中显示的中文格式月份:如七月\八月等

/

return turnMonth(sysNowTime[1]);

}

public void setDays(int monthDays,int initWeek,int day){

/

void setDays(int monthDays,int initWeek,int day)

@para monthDays 本月天数

@para initWeek 初始星期

@para day 今天日

设置月历

/

setDateNull();

for(int i=initWeek;i<initWeek+monthDays+1;i++){

if((i-initWeek+1)==day){

labelDay[i]setBorder(border1);

labelDay[i]setForeground(ColorBLUE);

labelDay[i]setFont(new Font("黑体",FontBOLD,20));

}else if((i%7==0)||(i%7==6))

labelDay[i]setForeground(ColorRED);

else{

labelDay[i]setForeground(ColorBLACK);

}

labelDay[i]setText(StringvalueOf(i-initWeek+1));

}

for(int i=initWeek+monthDays;i<42;i++)

labelDay[i]setText("");

}

class TimerListener implements ActionListener{

//AdapterDemo var=new AdapterDemo("万年历程序--Aidy");

public void actionPerformed(ActionEvent e) {

GregorianCalendar g = new GregorianCalendar();

String clock = new String((ggetTime()toString()split(" "))[3]);

labelTimesetText(clock);

}

}

public static void main(String args[])

{

try{

UIManagersetLookAndFeel(UIManagergetSystemLookAndFeelClassName());

}catch(Exception e){

throw new RuntimeException(e);

}

AidyCalender var=new AidyCalender("万年历程序--Aidy");

}

}

本文来自CSDN博客,转载请标明出处:>

农历是我国传统历法,又称华历、夏历、中历、国历、俗称阴历。定月的方法是以朔望月周期确定,朔所在日为初一。由于朔望月平均长度295306天,所以农历大月30天,小月29天。农历平年有十二个月,全年354天或355天(个别年份353天);闰年为十三个月,其中某一月为闰月,月名依前一月名而定,如前月是八月,闰月则为闰八月。闰年全年383天或384天(个别年份385天)。设置闰月的方法是:农历月份中无“中气”的月份则是闰月。

农历,又称夏历、汉历、华历,是中国传统历法。主要规则经历多个朝代逐渐完善形成,其形式一直延续至今。农历属于一种阴阳历,其年份分为平年和闰年。平年为十二个月;闰年为十二个普通月另加一个闰月,总共十三个月。月份分为大月和小月,大月三十天,小月二十九天,其平均历月等于一个朔望月。平年全年353~355天,闰年全年383~385天。为了协调朔望月和回归年之间的关系,所以设置闰月以使平均历年为一个回归年。置闰规则为使用冬至作为计算回归年的起点,从上一年冬至所在历月(十一月,也叫做冬月)到下一年冬至所在历月(十一月)之间,如果只有十二个朔望月,则设立为平年,不置闰,共354或355天。如果出现十三个朔望月时,则从上一年冬至所在历月(十一月)之后起算,使用第一个不含二十四气中任意一个中气的历月,设立为闰月,放在某一月之后就是闰几月。此外,农历二十四节气反映了季节的变化特征,有助于农业生产和人民生活。

民间俗称农历为“阴历”,其实是广为流传的谬称。因为农历实际上属于阴阳历,所以错误的俗称“阴历”应该弃用。真正纯阴历的特征是:只考虑月相的周期性变化,而不考虑回归年长度。月份与季节无关,没有平年和闰年之分,新年可以出现在阳历的任何一天。比如伊斯兰历才是一种真正的纯阴历。

农历的特点如下:

计算采用北京时间为标准。

太阳和月亮位置的计算依据国际天文学联合会(Internation Astronomical Union)下属的基础天文标准评 审委员会(the Standards Of Fundamental Astronomical Reviewing Board) 推荐的天体位置归算标准模型。

朔所在的农历日为农历月首。

冬至所在的月为十一月。

如果从某一年十一月开始到下一年十一月(不含)之间有13个 农历月,则取其中最先出现的一个不包含中气的农历月为闰月;

十一月之后第二个(不计闰月)农历月为农历年的起始月,称为正月。

农历年干支的参考时间:对应于1984年正月初一零时起到1984年腊月三十零时止的时间间隔的农历年为甲子年。

农历日干支的参考时间:北京时间1983年腊月廿九为甲子日。

朔日为每月起点(初一日);朔日(月初一日)到下个朔日(下月初一日)有多少天、这月就有多少天。有30天为大月、有29天为小月;唐朝武德二年(公元619年)以前用的是平朔,武德二年(公元619年)以后用的是定朔。

以冬至日必须在子月(十一月),上个冬至月(十一月)到下个冬至月如有12个月就不置闰,如有13个月就要置闰,以上个冬至月之后第一个无中气的月份为闰月,在几月后面就称闰几月。 例如:2032壬子年冬至月到2033癸丑年冬至月之间有12个月,就不置闰。2033癸丑年冬至月到2034甲寅年冬至月有13个月就必须置闰,在2033癸丑年冬至月后的第一个无中气之月是该月的下一个月,就定为闰月。它在十一月后,所以就叫闰十一月。

希望我能帮助你解疑释惑。

以上就是关于万年历阴历阳历转换全部的内容,包括:万年历阴历阳历转换、日期查询农历、java方法,如何算出某一个月的日期,比如说9月份,就可以吧1号到30号都能算出来。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/10150089.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存