摘 要
在生活中,时间已经成了人们生活中决策某些事情的主要原因,人们会随着时间去安排自己的生活,按照一定的节奏去过自己的精彩人生。
万年历最初是以在日历的方式呈现。
公历,公元,即公历纪年法,是一种源自于西方社会的纪年方法。原称基督纪元,又称西历或西元,是由意大利医生兼哲学家Aloysius Lilius对儒略历加以改革而制成的一种历法——《格里历》。辛亥革命爆发后次年(1912年),当时的中华民国政府采用公历作为国历,纪年方面,公元纪年法与民国纪年法并行。1949年9月27日,经过中国人民政治协商会议第一届全体会议通过,新成立的中华人民共和国使用国际社会上大多数国家通用的公历和公元作为历法与纪年。
农历,中国传统历法。它根据月相的变化周期,每一次月相朔望变化为一个月;并把一个太阳回归年划分为24段,形成二十四节气。通过参考太阳回归年,设置闰月使其平均历年与回归年相适应。农历融合阴历与阳历形成为一种阴阳合历历法。农历又有夏历、阴历、旧历、华历、中历等称。因使用“夏正”,旧时多称为夏历,1970年以后“夏历”改称为“农历”。农历属于阴阳合历,其年份分为平年和闰年。平年为十二个月;闰年为十三个月。月份分为大月和小月,大月三十天,小月二十九天,其平均历月等于一个朔望月。
程序使用JAVA语言,通过一些算法,将万年历以简易的方式呈现。
关键词:JAVA语言,阴历算法,阳历算法
第一章 概述
1.1 引言
万年历,一种日常使用的出版物,记载着日期等相关信息。
每一页显示一日信息的叫日历,每一页显示一个月信息的叫月历,每页显示全年信息的叫年历。有多种形式,如挂历、座台历、年历卡等,如今又有电子日历。
中国始有历法大约在四千多年以前。根据甲骨文中的一页甲骨历,证明殷代的历法已具有相当的水平,这一页甲骨历是全天下最古老的历书实物,这页甲骨历也就叫日历。现在万年历已经十分常见,所以通过计算机Java语言实现万年历的编程已经不是难事,我打算在结合万年历的最基本功能上添加年份查询,月份查询,记事本等功能万年历有很多作用,顾名思义它是一种很方便得计时计年工具,随着科技得发展,我们已经可以通过计算机制作出精美的万年历,通过计算机制作得万年历不但外观美观,而且功能强大。通过万年历,我们可以实现很多功能,随意看某年得年份,某年得月份,随意调整某年得某天,并将其显示出来,而且有判断闰年闰月得功能,十分方便。除此之外,万年历还具有记事本功能,通过记事本功能可以备忘一些事情,备忘得事情可以随意添加在万年历得任意年月日里,如果记录得内容已经不再需要,还可以任意的将记录得内容进行删除,在删除得时候还会提示,是否确定删除,如果是,则程序会将它删除,如果不是,则系统不会将它删除。
1.2 系统目标
程序设计目的是实现对年月日的准确判断,公历与星期的对应,主要实现对公历闰年的准确判断,给万年历增加查询功能让万年历更加人性化,同时加上记事本的功能为用户提供一个记录日程,日志的小工具,让程序更加丰富,为以后人们的生活提供一些方便。
1.3 系统的设计思路
第一部分计算公历,以1900年为公元元年,前后推知索要查找的年份,将对应的星期与每一天对应上。在每天的按钮中添加一个记事本,打到记录和保存日志的目的。上月下月的关键是隔年,一月与前一年的十二月,十二月与下一年的一月,通过判断语句实现准确的判断。
第二章 万年历程序的要求与分析
2.1 系统功能需求
2.1.1 记事本
2.1.2 查询某年某月对某日对应的公历农历
2.1.3 上下月份可循环翻阅
2.1.4 上下年份可循环翻阅
2.2系统的性能要求
无
2.3系统配置
2.3.1软件配置
服务器端:安装Java虚拟机
客户端: 安装Java虚拟机
开发环境:INTelliJ IDEA
开发语言:Java
数据库: 无
2.3.2硬件配置
服务器端:Centos6.5,有网络接口卡(NIC),内存应在4GB以上,硬盘在160GB以上。
电脑配置:CPU: Core i5 2.30GHz 内存:DDR3 8GB 硬盘:500GB
操作系统:Microsoft Windows10专业版
客户端:Core i5以上配置的PC机,有网络接口卡(NIC),内存应在4GB以上,硬盘在500GB以上。
电脑配置:CPU: Core i5 2.30GHz 内存:DDR3 8GB 硬盘:500GB
操作系统:Microsoft Windows 10专业版
2.3.3网络配置
网络:有无均可
2.4系统的未来可能提出的要求
2.5可行性分析
2.5.1经济可行性
2.5.2技术可行性
2.5.2 社会可行性
如今的社会是一个信息的时代,随着电脑等科技产品在人们生活中占据着越来越重要的地位,人们就会越加的善加利用,这为我们的生活带来了极大的效率,同时计算机的普及更可以看出它所占的地位。万年历作为日常中的一种小工具,它具有多方面的小工能,主要在日期的显示上给人以直观的表达效果,在日期的查询上方便简洁,还有就是在某些节日的提醒上都给我们带来极大的方便,是一种比较实用的小工具。未来由于人们对周易等风水学说的钻研,可能要添加关于随即计算某日的宜忌等涉及人们利弊的功能
第三章 万年历程序总体设计
3.1系统的总体功能
系统所实现的功能强弱是衡量一个软件好坏的最直接也是最根本的标准。经过对系统的可行性分析、需求分析、数据分析以及数据库设计后,结合情况,万年历程序的功能模块如图,
3.2 系统功能设计
3.2.1 查询功能
主要包括年月份在输入框内的查询
3.2.2 上下月翻阅功能
主要是对近期月份的相关查询
3.2.3上下年搜翻阅功能
主要是对近期年份的相关查询
3.2.4年份的查询功能
主要是对较远年份的方便查询
3.2.5记事本功能
主要是为用户提供记录删除日志的功能
第四章 详细设计
4.1 开发语言的选用及其介绍
4.1.1 java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程,
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
4.2 详细模块设计
4.2.1 查询功能:
主要是为了方便用户查询那一年那一月那一天
4.2.2上下月翻页功能:
主要方便用户对近期月分的查询,例如查询了1900年12月的日历
4.2.3记事本功能:主要帮助用户记录,保存,删除一些日志
|
|
第五章 系统实现与测试
5.1 系统实现
5.1.1 查看功能
5.1.2 记事设置功能
用户录入当天的日程
用户删除当天日程
保存当天日程
程序代码
import java.util.Calendar;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Hashtable;
public class CalendarPad extends JFrame implements MouseListener
{
int year,month,day;
Hashtable hashtable;
File file;
JTextField showDay[];
JLabel title[];
Calendar rili;
int 星期几;
NotePad notepad=null;
Month a ;//负责改变月
Year b;//负责改变年;
String 星期[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
JPanel leftPanel,rightPanel;
public CalendarPad(int year,int month,int day)
{
leftPanel=new JPanel();
JPanel leftCenter=new JPanel();
JPanel leftNorth=new JPanel();
leftCenter.setLayout(new GridLayout(7,7)); //显示日历;
rightPanel=new JPanel();
this.year=year;
this.month=month;
this.day=day;
b=new Year(this);
b.setYear(year);
a=new Month(this);
a.setMonth(month);
title=new JLabel[7];
showDay=new JTextField[42];
for(int j=0;j<7;j++)
{
title[j]=new JLabel();
title[j].setText(星期[j]);
title[j].setBorder(BorderFactory.createRaisedBevelBorder());
leftCenter.add(title[j]);
}
title[0].setForeground(Color.red);
title[6].setForeground(Color.blue);
for(int i=0;i<42;i++)
{
showDay[i]=new JTextField(); //JTextField showDay[];
showDay[i].addMouseListener(this);
showDay[i].setEditable(false);
leftCenter.add(showDay[i]);
}
rili=Calendar.getInstance();
Box box=Box.createHorizontalBox();
box.add(b);
box.add(a);
leftNorth.add(box);
leftPanel.setLayout(new BorderLayout());
leftPanel.add(leftNorth,BorderLayout.CENTER);
leftPanel.add(leftCenter,BorderLayout.SOUTH);
leftPanel.add(new Label("请在年份输入框输入所查年份(负数表示公元前),并回车确定"),
BorderLayout.NORTH) ;
leftPanel.validate();
Container con=getContentPane();
JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
leftPanel,rightPanel);
con.add(split,BorderLayout.CENTER);
con.validate();
hashtable=new Hashtable();
file=new File("日历记事本.txt");
if(!file.exists())
{
try{
FileOutputStream out=new FileOutputStream(file);
ObjectOutputStream objectOut=new ObjectOutputStream(out);
objectOut.writeObject(hashtable);
objectOut.close();
out.close();
}
catch(IOException e)
{
}
}
notepad=new NotePad(this);
rightPanel.add(notepad);
setCalendar(year,month);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
setVisible(true);
setBounds(100,100,524,285);
validate();
}
public void setCalendar(int year,int month)//设置日历牌
{
rili.set(year,month-1,1);
星期几=rili.get(Calendar.DAY_OF_WEEK)-1;
if(month==1||month==2||month==3||month==5||month==7
||month==8||month==10||month==12)
{
排列号码(星期几,31);
}
else if(month==4||month==6||month==9||month==11)
{
排列号码(星期几,30);
}
else if(month==2)
{
if((year%4==0&&year%100!=0)||(year%400==0))
{
排列号码(星期几,29);
}
else
{
排列号码(星期几,28);
}
}
}
public void 排列号码(int 星期几,int 月天数)
{
for(int i=星期几,n=1;i<星期几+月天数;i++)
{
showDay[i].setText(""+n);
if(n==day)
{
showDay[i].setForeground(Color.green);
showDay[i].setFont(new Font("TimesRoman",Font.BOLD,20));
}
else
{
showDay[i].setFont(new Font("TimesRoman",Font.BOLD,12));
showDay[i].setForeground(Color.black);
}
if(i%7==6)
{
showDay[i].setForeground(Color.blue);
}
if(i%7==0)
{
showDay[i].setForeground(Color.red);
}
n++;
}
for(int i=0;i<星期几;i++)
{
showDay[i].setText("");
}
for(int i=星期几+月天数;i<42;i++)
{
showDay[i].setText("");
}
}
public int getYear()
{
return year;
}
public void setYear(int y)
{
year=y;
notepad.setYear(year);
}
public int getMonth()
{
return month;
}
public void setMonth(int m)
{
month=m;
notepad.setMonth(month);
}
public int getDay()
{
return day;
}
public void setDay(int d)
{
day=d;
notepad.setDay(day);
}
public Hashtable getHashtable()
{
return hashtable;
}
public File getFile()
{
return file;
}
public void mousePressed(MouseEvent e)
{
JTextField source=(JTextField)e.getSource();
try{
day=Integer.parseInt(source.getText());
notepad.setDay(day);
notepad.设置信息条(year,month,day);
notepad.设置文本区(null);
notepad.获取日志内容(year,month,day);
}
catch(Exception ee)
{
}
}
public void mouseClicked(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public static void main(String args[])
{
Calendar calendar=Calendar.getInstance();
int y=calendar.get(Calendar.YEAR);
int m=calendar.get(Calendar.MONTH)+1;
int d=calendar.get(Calendar.DAY_OF_MONTH);
new CalendarPad(y,m,d);
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Month extends Box implements ActionListener
{
int month;
JTextField showMonth=null;
JButton nextMonth, laterMonth;
CalendarPad cal1;
public Month(CalendarPad cal1)
{
super(BoxLayout.X_AXIS);
this.cal1=cal1;
showMonth=new JTextField(2);
month=cal1.getMonth();
showMonth.setEditable(false);
showMonth.setForeground(Color.blue);
showMonth.setFont(new Font("TimesRomn",Font.BOLD,16));
nextMonth=new JButton("下一月");
laterMonth=new JButton("上一月");
add(laterMonth);
add(showMonth);
add(nextMonth);
laterMonth.addActionListener(this);
nextMonth.addActionListener(this);
showMonth.setText(""+month);
}
public void setMonth(int month)
{
if(month<=12&&month>=1)
{
this.month=month;
}
else
{
this.month=1;
}
showMonth.setText(""+month);
}
public int getMonth()
{
return month;
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==laterMonth)
{
if(month>=2)
{
month=month-1;
cal1.setMonth(month);
cal1.setCalendar(cal1.getYear(),month);
}
else if(month==1)
{
month=12;
cal1.setMonth(month);
cal1.setCalendar(cal1.getYear(),month);
}
showMonth.setText(""+month);
}
else if(e.getSource()==nextMonth)
{
if(month<12)
{
month=month+1;
cal1.setMonth(month);
cal1.setCalendar(cal1.getYear(),month);
}
else if(month==12)
{
month=1;
cal1.setMonth(month);
cal1.setCalendar(cal1.getYear(),month);
}
showMonth.setText(""+month);
}
}
}
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.JTextArea.*;
import javax.swing.event.*;
import java.io.*;
public class NotePad extends JPanel implements ActionListener,ItemListener
{
Font f;
TextArea text=new TextArea(15,25);
JButton nu,color;
JButton 保存日志,删除日志;
Hashtable table;
JLabel 信息条;
Choice o,c;
int year,month,day;
File file;
CalendarPad calendar;
public NotePad(CalendarPad calendar)
{
this.calendar=calendar;
year=calendar.getYear();
month=calendar.getMonth();
day=calendar.getDay();
table=calendar.getHashtable();
file=calendar.getFile();
信息条=new JLabel(""+year+"年"+month+"月"+day+"日",JLabel.CENTER);
o=new Choice();
c=new Choice();
信息条.setFont(new Font("TimesRoman",Font.BOLD,16));
o.setFont(new Font("TimesRoman",Font.BOLD,16));
c.setFont(new Font("TimesRoman",Font.BOLD,16));
信息条.setForeground(Color.cyan);
o.setForeground(Color.cyan);
c.setForeground(Color.cyan);
//字体.add("宋体");
//字体.add("黑体");
c.add("红");
c.add("蓝");
c.add("绿");
c.add("黄");
保存日志=new JButton("保存日志") ;
删除日志=new JButton("删除日志") ;
保存日志.addActionListener(this);
删除日志.addActionListener(this);
setLayout(new BorderLayout());
JPanel pSouth=new JPanel();
JPanel pNorth=new JPanel();
JPanel pCenter=new JPanel();
pCenter.setLayout(new BorderLayout());
JPanel p1=new JPanel();
JPanel p2=new JPanel();
pNorth.add(信息条);
p1.add(o);
p1.add(c);
pCenter.add(p1,BorderLayout.NORTH);
pCenter.add(text,BorderLayout.SOUTH);
pSouth.add(保存日志);
pSouth.add(删除日志);
add( pNorth,BorderLayout.NORTH);
add(pSouth,BorderLayout.SOUTH);
add(pCenter,BorderLayout.CENTER);
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
String fontName[]=ge.getAvailableFontFamilyNames();
o.addItemListener(this);
c.addItemListener(this);
for(int i=0;i<fontName.length;i++)
{
o.add(fontName[i]);
}
setVisible(true);
}
public void itemStateChanged(ItemEvent e) {
if(e.getItemSelectable()==o||e.getItemSelectable()==c)
{
String name=o.getSelectedItem();
Font f=new Font(name,Font.BOLD,15);
text.setText("请在这里输入内容");
text.setFont(f);
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==保存日志)
{
保存日志(year,month,day);
}
else if(e.getSource()==删除日志)
{
删除日志(year,month,day);
}
}
public void setYear(int year)
{
this.year=year;
}
public int getYear()
{
return year;
}
public void setMonth(int month)
{
this.month=month;
}
public int getMonth()
{
return month;
}
public void setDay(int day)
{
this.day=day;
}
public int getDay()
{
return day;
}
public void 设置信息条(int year,int month,int day)
{
信息条.setText(""+year+"年"+month+"月"+day+"日");
}
public void 设置文本区(String s)
{
text.setText(s);
}
public void 获取日志内容(int year,int month,int day)
{
String key=""+year+""+month+""+day;
try
{
FileInputStream inOne=new FileInputStream(file);
ObjectInputStream inTwo=new ObjectInputStream(inOne);
table=(Hashtable)inTwo.readObject();
inOne.close();
inTwo.close();
}
catch(Exception ee)
{
}
if(table.containsKey(key))
{
String m=""+year+"年"+month+"月"+day+"这一天有日志记载,想看吗?";
int ok=JOptionPane.showConfirmDialog(this,m,"询问",JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if(ok==JOptionPane.YES_OPTION)
{
text.setText((String)table.get(key));
}
else
{
text.setText("");
}
}
else
{
text.setText("无记录");
}
}
public void 保存日志(int year,int month,int day)
{
String 日志内容=text.getText();
String key=""+year+""+month+""+day;
String m=""+year+"年"+month+"月"+day+"保存日志吗?";
int ok=JOptionPane.showConfirmDialog(this,m,"询问",JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if(ok==JOptionPane.YES_OPTION)
{
try
{
FileInputStream inOne=new FileInputStream(file);
ObjectInputStream inTwo=new ObjectInputStream(inOne);
table=(Hashtable)inTwo.readObject();
inOne.close();
inTwo.close();
table.put(key,日志内容);
FileOutputStream out=new FileOutputStream(file);
ObjectOutputStream objectOut=new ObjectOutputStream(out);
objectOut.writeObject(table);
objectOut.close();
out.close();
}
catch(Exception ee)
{
}
}
}
public void 删除日志(int year,int month,int day)
{
String key=""+year+""+month+""+day;
if(table.containsKey(key))
{
String m="删除"+year+"年"+month+"月"+day+"日的日志吗?";
int ok=JOptionPane.showConfirmDialog(this,m,"询问",JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if(ok==JOptionPane.YES_OPTION)
{
try
{
FileInputStream inOne=new FileInputStream(file);
ObjectInputStream inTwo=new ObjectInputStream(inOne);
table=(Hashtable)inTwo.readObject();
inOne.close();
inTwo.close();
table.remove(key);
FileOutputStream out=new FileOutputStream(file);
ObjectOutputStream objectOut=new ObjectOutputStream(out);
objectOut.writeObject(table);
objectOut.close();
out.close();
text.setText(null);
}
catch(Exception ee)
{
}
}
}
else
{
String m=""+year+"年"+month+"月"+day+"无日志记录";
JOptionPane.showMessageDialog(this,m,"提示",JOptionPane.WARNING_MESSAGE);
}
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Year extends Box implements ActionListener
{
int year;
JTextField showYear=null;
JButton nextYear,laterYear;
CalendarPad cal;
public Year(CalendarPad cal)
{
super(BoxLayout.X_AXIS);
showYear=new JTextField(4);
showYear.setForeground(Color.blue);
showYear.setFont(new Font("TimesRomn",Font.BOLD,14));
this.cal=cal;
year=cal.getYear();
nextYear=new JButton("nextyear");
laterYear=new JButton("lateryear");
add(laterYear);
add(showYear);
add(nextYear);
showYear.addActionListener(this);
laterYear.addActionListener(this);
nextYear.addActionListener(this);
}
public void setYear(int year)
{
this.year=year;
showYear.setText(""+year);
}
public int getYear()
{
return year;
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==laterYear)
{
year=year-1;
showYear.setText(""+year);
cal.setYear(year);
cal.setCalendar(year,cal.getMonth());//setCalendar设置日历牌
}
else if(e.getSource()==nextYear)
{
year=year+1;
showYear.setText(""+year);
cal.setYear(year);
cal.setCalendar(year,cal.getMonth());
}
else if(e.getSource()==showYear)
{
try
{
year=Integer.parseInt(showYear.getText());
showYear.setText(""+year);
cal.setYear(year);
cal.setCalendar(year,cal.getMonth());
}
catch(NumberFormatException ee)
{
showYear.setText(""+year);
cal.setYear(year);
cal.setCalendar(year,cal.getMonth());
}
}
}
}