題目如下:
寫一程式,讓使用者輸入兩組西元年、月、日,求其間隔天數。
例如:輸入資料為1998 年1 月1 日及 1999 年1 月2 日,則輸出為366 天。
(須考慮閏年2 月多一天情形)學長的建議是:
實作的方針只有一個 , 把兩個日期單位都先換算成「日」再來做加減.
要把一個含年月日的日期換成日你需要的資訊有下1.年換日的換算法-> 一年有365天
閏年的話 , 透過年的起終點應該可以算出有多少閏年,
先算四的倍數* , 再算百的倍數(如果題目的範圍有到百的話...)2.月換日的換算法-> 算出1/1到每個月1號之前累積的總日數.
(我想聰明的學弟妹們應該可以用if-else區分,
哪些是大月哪些是小月 , 哪個是只有28天的.
閏年的話只要先判斷好 , 也可以測出哪個月是29天的. )把1跟2的資訊加起來 , 再加上日期就得到一個只有日的值了.*取四的倍數的方法:
先取超過起點第一個符合四的倍數A, 接近終點最後一個符合四的倍數B,
(B-A)/4 +1 就是四的倍數的數量 , 同理可用於百的倍數.===================================================我閏年和大小月整個弄不出來= =
麻煩有人可以用if-else語法或者switch語法,
並且參照上述學長的建議,
來寫出此程式!
真心求教~~感激!!!
請別用迴圈或API等捷徑,我還沒學到那!
寫一程式,讓使用者輸入兩組西元年、月、日,求其間隔天數。
例如:輸入資料為1998 年1 月1 日及 1999 年1 月2 日,則輸出為366 天。
(須考慮閏年2 月多一天情形)學長的建議是:
實作的方針只有一個 , 把兩個日期單位都先換算成「日」再來做加減.
要把一個含年月日的日期換成日你需要的資訊有下1.年換日的換算法-> 一年有365天
閏年的話 , 透過年的起終點應該可以算出有多少閏年,
先算四的倍數* , 再算百的倍數(如果題目的範圍有到百的話...)2.月換日的換算法-> 算出1/1到每個月1號之前累積的總日數.
(我想聰明的學弟妹們應該可以用if-else區分,
哪些是大月哪些是小月 , 哪個是只有28天的.
閏年的話只要先判斷好 , 也可以測出哪個月是29天的. )把1跟2的資訊加起來 , 再加上日期就得到一個只有日的值了.*取四的倍數的方法:
先取超過起點第一個符合四的倍數A, 接近終點最後一個符合四的倍數B,
(B-A)/4 +1 就是四的倍數的數量 , 同理可用於百的倍數.===================================================我閏年和大小月整個弄不出來= =
麻煩有人可以用if-else語法或者switch語法,
並且參照上述學長的建議,
來寫出此程式!
真心求教~~感激!!!
請別用迴圈或API等捷徑,我還沒學到那!
将给定的日历字段设置为给定值。
void set(int year, int month, int date)
设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
void set(int year, int month, int date, int hourOfDay, int minute)
设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second)
设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。 这四个方法 你看着设置时间..long getTimeInMillis()
返回此 Calendar 的时间值,以毫秒为单位。 获得毫秒值..然后相减..剪得的数..就是相差的毫秒值..自己换算 总能得到 天数吧..setTimeInMillis(long millis)
用给定的 long 值设置此 Calendar 的当前时间值。这个方法也可以用用.
//两个时间之间的天数 SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date date= myFormatter.parse("2003-05-1"); java.util.Date mydate= myFormatter.parse("1899-12-30"); long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);
详见我的博客:JAVA中日期的处理
http://blog.csdn.net/yinyuan1987/archive/2008/10/16/3087259.aspx
/**
* 计算两个日期之间的天数
* @param beginDate
* @param endDate
* @return
*/
public int daysOfTwoDate(Date beginDate,Date endDate){
int days = 0;//两个日期之前的天数
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar beginCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);
endCalendar.setTime(endDate);
//计算天数
while(beginCalendar.before(endCalendar)){
days++;
beginCalendar.add(Calendar.DAY_OF_MONTH, 1);
}
return days;
}
很感謝各位的回覆...
可是很不好意思的是,
目前Date和Calendar的語法我還未教到,
所以我想老師的本意應該也不是希望我們用這個語法來完成此項題目~
所以麻煩各位用if-else的語法或seitch的語法來宣告很多變數,
給使用者輸入2組日期,然後算出相差多少天~
詳情請參照頂樓我發的"學長的建議"那邊~~
感激不盡m(_ _)m
import java.text.*;
public class TestTime{
static int day=0;
static long d=0,l=0;
public static void main(String [] args){
long day=0;
TestTime a=new TestTime();
try{
day=(int)a.getCompareDate();
}catch(Exception se){
se.printStackTrace();
}
int ten=(int)day/10;
int gen=(int)day%10;
System.out.println(gen+"aa"+ten+"bb"+day);
}
public static long getCompareDate(){
Calendar cal = Calendar.getInstance();
//当前年月日
int year=cal.get(Calendar.YEAR);
int month=cal.get(Calendar.MONTH);
int date=cal.get(Calendar.DATE);
//System.out.println("年"+year+"月"+month+"日"+date);
cal.set(year, month, date);
Date date1=cal.getTime();
cal.set(2008,Calendar.AUGUST,8);
Date date2=cal.getTime();
l=(date2.getTime()-date1.getTime())/(24*60*60*1000);
return l;
}
}
private int startYear;
private int startMonth;
private int startDay;
private int endYear;
private int endMonth;
private int endDay;
private int dayNum;
Scanner scanner = new Scanner(System.in);
public TestDayNum(){
System.out.println("请输入起始日期: ");
System.out.print("年: ");
startYear = scanner.nextInt();
System.out.print("月: ");
startMonth = scanner.nextInt();
System.out.print("日: ");
startDay = scanner.nextInt();
System.out.println("请输入结束日期: ");
System.out.print("年: ");
endYear = scanner.nextInt();
System.out.print("月: ");
endMonth = scanner.nextInt();
System.out.print("日: ");
endDay = scanner.nextInt();
}
private void countDayNum() {
if(this.endYear < this.startYear) {//结束年小于起始年*报错*
System.out.println("输入的年有错误!");
}else if(this.endYear == this.startYear){//若年相等
if(this.endMonth < this.startMonth) {//结束月小于起始月*报错*
System.out.println("输入的月有错误!");
}else if(this.endMonth == this.startMonth){//若月相等
if(this.endDay < this.startDay) {//结束日小于起始日*报错*
System.out.println("输入的日有错误!");
}else if(this.endDay >= this.startDay){//年月相等,日正确
this.dayNum = this.endDay - this.startDay;//结果
}
}else if(this.endMonth > this.startMonth) {//年相等,月正确
/*先算出两个月份中间的月份有多少天*/
for(int i = this.startMonth + 1; i <= this.endMonth - 1; i++) {
this.dayNum += monthDayNum(i, this.startYear);
}
/*判断起始月的天数*/
int startMonthDayNum = monthDayNum(this.startMonth, this.startYear);
//加上起始月还剩下的天数
this.dayNum += startMonthDayNum - this.startDay + 1;
//加上结束月已经过了的天数
this.dayNum += this.endDay - 1;
}
}else if(this.endYear > this.startYear) {//年正确
/*算出年之间的天数*/
for(int i = this.startYear + 1; i <= this.endYear - 1; i++) {
if(isLeapyear(i)) {//如果是闰年
this.dayNum += 366;
}else{
this.dayNum += 365;
}
}
/*起始月距离该年结束的天数*/
for(int i = this.startMonth + 1; i <= 12; i++) {
this.dayNum += monthDayNum(i, this.startYear);
}
//判断起始月的天数
int startMonthDayNum = monthDayNum(this.startMonth, this.startYear);
//加上起始月还剩下的天数
this.dayNum += startMonthDayNum - this.startDay + 1;
/*结束月距离年初的天数*/
for(int i = 1; i <= this.endMonth - 1; i++) {
this.dayNum += monthDayNum(i, this.endYear);
}
//加上结束月已经过了的天数
this.dayNum += this.endDay - 1;
}
System.out.println(this.startYear + "年" + this.startMonth + "月"
+ this.startDay + "日\n距离\n" + this.endYear + "年"
+ this.endMonth + "月" + this.endDay + "日\n有\n"
+ this.dayNum + "天");
}
/**
* 计算是否是闰年
* @param year
* @return
*/
private boolean isLeapyear(int year)
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
return true;
}
return false;
}
/**
* 计算月份间的天数
*/
private int monthDayNum(int tempMonth, int tempYear) {
int dayNum = 0;
switch (tempMonth){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: dayNum += 31;
break;
case 4:
case 6:
case 9:
case 11: dayNum += 30;
break;
case 2: if(isLeapyear(tempYear)){//这里起始年与结束年相等
dayNum += 29;
}else{
dayNum += 28;
}
break;
default: break;
}
return dayNum;
} /**
* @param args
*/
public static void main(String[] args) {
TestDayNum tdn = new TestDayNum();
tdn.countDayNum();
}
}自己写的算法,由于时间紧,输入的约束判断没有加上。
dayNum += 29;
}else{
dayNum += 28;
}
break;这个注释测试时候用的,在这里去掉
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;public class Test_3_B5 { public static void main(String[] args) {
Frame frame = new Frame();
frame.setBounds(50, 50, 300, 300);
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
final TextField td1 = new TextField(30);
final TextField td2 = new TextField(30);
final TextField result = new TextField(30);
Panel p = new Panel();
p.add(td1);
p.add(td2); Button btn = new Button("开始比较");
p.add(btn);
p.add(result);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String str1 = td1.getText();
String str2 = td2.getText();
try {
Date date1 = sdf.parse(str1);
long t1 = date1.getTime();
Date date2 = sdf.parse(str2);
long t2 = date2.getTime();
System.out.println(t2 - t1);
long days = 0;
if (date1.before(date2)) {
days = (t2 - t1) / (1000 * 60 * 60 * 24);
} else {
days = (int) (t1 - t2) / (1000 * 60 * 60 * 24);
}
result.setText("" + date1.before(date2) + " 相隔 " + days+" 天");
} catch (ParseException e) {
e.printStackTrace();
}
}
});
frame.add(p);
frame.setVisible(true);
}
}
private int startYear;
private int startMonth;
private int startDay;
private int endYear;
private int endMonth;
private int endDay;
private int outputStartYear; //保存输入结果,供输出时使用
private int outputStartMonth;
private int outputStartDay;
private int outputEndYear;
private int outputEndMonth;
private int outputEndDay;
private int dayNum;
private int tempYear;
private int tempMonth;
private int tempDay;
Scanner scanner = new Scanner(System.in);
public TestDayNum(){
System.out.println("请输入起始日期: ");
System.out.print("年: ");
startYear = scanner.nextInt();
outputStartYear = startYear;//输出时使用
System.out.print("月: ");
startMonth = scanner.nextInt();
outputStartMonth = startMonth;
System.out.print("日: ");
startDay = scanner.nextInt();
outputStartDay = startDay;
System.out.println("请输入结束日期: ");
System.out.print("年: ");
endYear = scanner.nextInt();
outputEndYear = endYear;
System.out.print("月: ");
endMonth = scanner.nextInt();
outputEndMonth = endMonth;
System.out.print("日: ");
endDay = scanner.nextInt();
outputEndDay = endDay;
}
private void countDayNum() {
if(this.startYear > this.endYear) {//起始年大于结束年,全部信息交换
this.tempYear = this.endYear;
this.endYear = this.startYear;
this.startYear = this.tempYear;
this.tempMonth = this.endMonth;
this.endMonth = this.startMonth;
this.startMonth = this.tempMonth;
this.tempDay = this.endDay;
this.endDay = this.startDay;
this.startDay = this.tempDay;
}
if(this.endYear == this.startYear){//若年相等
if(this.endMonth < this.startMonth) {//起始月大于结束月,信息转换
this.tempMonth = this.endMonth;
this.endMonth = this.startMonth;
this.startMonth = this.tempMonth;
this.tempDay = this.endDay;
this.endDay = this.startDay;
this.startDay = this.tempDay;
}
if(this.endMonth == this.startMonth){//若月相等
this.dayNum = Math.abs(this.endDay - this.startDay);//结果
}else {//年相等,月正确
/*先算出两个月份中间的月份有多少天*/
for(int i = this.startMonth + 1; i <= this.endMonth - 1; i++) {
this.dayNum += monthDayNum(i, this.startYear);
}
/*判断起始月的天数*/
int startMonthDayNum = monthDayNum(this.startMonth, this.startYear);
//加上起始月还剩下的天数
this.dayNum += startMonthDayNum - this.startDay + 1;
//加上结束月已经过了的天数
this.dayNum += this.endDay - 1;
}
}else {//年正确
/*算出年之间的天数*/
for(int i = this.startYear + 1; i <= this.endYear - 1; i++) {
if(isLeapyear(i)) {//如果是闰年
this.dayNum += 366;
}else{
this.dayNum += 365;
}
}
/*起始月距离该年结束的天数*/
for(int i = this.startMonth + 1; i <= 12; i++) {
this.dayNum += monthDayNum(i, this.startYear);
}
//判断起始月的天数
int startMonthDayNum = monthDayNum(this.startMonth, this.startYear);
//加上起始月还剩下的天数
this.dayNum += startMonthDayNum - this.startDay + 1;
/*结束月距离年初的天数*/
for(int i = 1; i <= this.endMonth - 1; i++) {
this.dayNum += monthDayNum(i, this.endYear);
}
//加上结束月已经过了的天数
this.dayNum += this.endDay - 1;
}
System.out.println(this.outputStartYear + "年" + this.outputStartMonth + "月"
+ this.outputStartDay + "日\n距离\n" + this.outputEndYear + "年"
+ this.outputEndMonth + "月" + this.outputEndDay + "日\n有\n"
+ this.dayNum + "天");
}
/**
* 计算是否是闰年
* @param year
* @return
*/
private boolean isLeapyear(int year)
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
return true;
}
return false;
}
/**
* 计算月份间的天数
*/
private int monthDayNum(int tempMonth, int tempYear) {
int dayNum = 0;
switch (tempMonth){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: dayNum += 31;
break;
case 4:
case 6:
case 9:
case 11: dayNum += 30;
break;
case 2: if(isLeapyear(tempYear)){
dayNum += 29;
}else{
dayNum += 28;
}
break;
default: break;
}
return dayNum;
} /**
* @param args
*/
public static void main(String[] args) {
TestDayNum tdn = new TestDayNum();
tdn.countDayNum();
}
}修改好了~
真的是非常非常的感激你Q_Q
不過我發現...
private、for和this的語法我還未學到阿!!!
難怪我有些看不明白呢Orz|||
所以...能否改寫成沒有private、for和this語法的呢?...
就是只留下int、boolean、if-else和switch語法就好了......
如此麻煩大家,真是抱歉>_<
鄙人在此感激不盡m(_ _)m
public class MainTest {
public static void main(String[] args) {
MainTest mainTest = new MainTest();
System.out.println(mainTest.calcDateDiff(2008,12,1,2007,12,2)); // =365
}
// 计算[eYear年eMonth月eDay日] 减去 [sYear年sMonth月sDay日] 的天数
public long calcDateDiff(int eYear, int eMonth, int eDay, int sYear, int sMonth, int sDay) {
int monthday[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
//计算两个年份1月1日之间相差的天数
long diffDays = (eYear - sYear) * 365;
diffDays += (eYear - 1) / 4 - (sYear - 1) / 4;
diffDays -= ((eYear - 1) / 100 - (sYear - 1) / 100);
diffDays += (eYear - 1) / 400 - (sYear - 1) / 400;
//加上endYear年1月1日到endMonth月endDay日之间的天数
diffDays += monthday[eMonth - 1] + (this.isLeapYear(eYear) && eMonth > 2 ? 1 : 0);
diffDays += eDay;
//减去startYear年1月1日到startMonth月startDay日之间的天数
diffDays -= (monthday[sMonth - 1] + (this.isLeapYear(sYear) && sMonth > 2 ? 1 : 0));
diffDays -= sDay;
return diffDays;
}
// 是否是闰年
public boolean isLeapYear(int year) {
return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
}
}
--->月不等--->起始月>结束月--->交换月和日(保证大的在后面,小的在前面)
--->算出两个月之间的天数(如:4月与7月,则算出5,6月的天数)
--->加上起始月距离该月剩下的天数(如: 4月5号,就是26天)
--->加上结束月过了的天数(如:7月8号,就是7天)
--->结果
--->起始月<结束月--->不用交换(剩下工作如上)--->结果年不相等--->起始年>结束年--->交换年月日(保证大的在后面,小的在前面)
--->算出两个年之间的天数(如:2000与2004,则算出2001,2002,2003的天数)
--->加上起始月距离该年结束的天数(如:10月,算出11,12月的天数)
--->加上起始月距离该月剩下的天数(如: 10月5号,就是27天)
--->加上结束月距离该年年初的天数(如:3月,算出1,2月的天数)
--->加上结束月过了的天数(如:3月8号,就是7天)
--->结果
--->起始年<结束年--->不用交换(剩下工作如上)--->结果2.楼上的
楼上的算法更加简单起始年到结束年的天数(如:2005与2008,则算出2005,2006,2007,都先按365天算再来判断是否闰年进行加减)
--->加上结束月距离该年年初的天数(如:3月,算出1,2月的天数,因为事先将月份存入数组不用循环,先按不是
闰年的情况进行计算,再判断是否是闰年进行加减)
--->加上结束月过了的天数(如:3月8号,就是8天)
--->减去起始月距离该年年初的天数(因为在算起始年到结束年的天数时候,已经将这部分算入)
--->减去起始月过了的天数(同理)非常不错的算法!
--->月不等--->起始月>结束月--->交换月和日(保证大的在后面,小的在前面)
--->算出两个月之间的天数(如:4月与7月,则算出5,6月的天数)
--->加上起始月距离该月剩下的天数(如: 4月5号,就是26天)
--->加上结束月过了的天数(如:7月8号,就是7天)
--->结果
--->起始月 <结束月--->不用交换(剩下工作如上)--->结果 年不相等--->起始年>结束年--->交换年月日(保证大的在后面,小的在前面)
--->算出两个年之间的天数(如:2000与2004,则算出2001,2002,2003的天数)
--->加上起始月距离该年结束的天数(如:10月,算出11,12月的天数)
--->加上起始月距离该月剩下的天数(如: 10月5号,就是27天)
--->加上结束月距离该年年初的天数(如:3月,算出1,2月的天数)
--->加上结束月过了的天数(如:3月8号,就是7天)
--->结果
--->起始年 <结束年--->不用交换(剩下工作如上)--->结果--->表示分支
/**
* <p>返回两个日期之间的相隔天数</p>
* @param a java.util.Date
* @param b java.util.Date
* @return int 间隔数
* @throws ParseException
*/
public static int dateDiff(java.util.Date a, java.util.Date b) throws ParseException
{
int tempDifference = 0;
int difference = 0;
Calendar earlier = Calendar.getInstance();
Calendar later = Calendar.getInstance(); if (a.compareTo(b) < 0)
{
earlier.setTime(a);
later.setTime(b);
}
else
{
earlier.setTime(b);
later.setTime(a);
} while (earlier.get(Calendar.YEAR) != later.get(Calendar.YEAR))
{
tempDifference = 365 * (later.get(Calendar.YEAR) - earlier.get(Calendar.YEAR));
difference += tempDifference; earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
} if (earlier.get(Calendar.DAY_OF_YEAR) != later.get(Calendar.DAY_OF_YEAR))
{
tempDifference = later.get(Calendar.DAY_OF_YEAR)
- earlier.get(Calendar.DAY_OF_YEAR);
difference += tempDifference; earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
} return difference;
}
看下这个,很简单的实现方式