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号都能算出来。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)