java计算两个时间相隔月数,考虑闰年
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java计算两个时间相隔月数,考虑闰年相关的知识,希望对你有一定的参考价值。
我用的J2ME相对类比较少,希望能用Date类就能解决,例如SimpleDateFormat和GregorianCalendar等时间类都用不了.
我试图这样解决:
month1=(year1-year2)*12;
month2=month1-month2;
if(day1>=day2)
monthdiff=month1+month2+1;
else
monthdiff=month1+month2-1;
思路不知道是否正确,另外在减天数时没有考虑到闰年,所以恳请大家帮忙解决.
* 判断平闰年方法
*/
public void pingrunnian()
int year = 0;
//从组件处得到年份(这里是用下拉菜单做的)
if (jtf3.getSelectedIndex() > 0)
year = (Integer) jtf3.getSelectedItem();
int month = 0;
//从组件处得到月份(这里是用下拉菜单做的)
if (jtf4.getSelectedIndex() > 0)
month = (Integer) jtf4.getSelectedItem();
int day = 0;
switch (month)
//大月
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
//小月
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
if ((0 == year % 400) || (0 == year % 4 && 0 != year % 100))
day = 29;
else
day = 28;
break;
//下面的是向组件里添加得到的值的。 上面才是关键
//jtf5.removeAllItems();
//jtf5.addItem("DD");
//for (int i = 1; i <= day; i++)
// jtf5.addItem(i);
参考技术A java中Calendar类提供了月份计算方法的,直接通过Month方法进行计算得出月份差,之后算出年份的差乘以12,之后的和就是月份差。
public void monthSpace() throws ParseException
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String str1 = "2012-02-01";
String str2 = "2012-02-2";
Calendar bef = Calendar.getInstance();
Calendar aft = Calendar.getInstance();
bef.setTime(sdf.parse(str1));
aft.setTime(sdf.parse(str2));
int result = aft.get(Calendar.MONTH) - bef.get(Calendar.MONTH);
int month = (aft.get(Calendar.YEAR) - bef.get(Calendar.YEAR))*12;
System.out.println(month+result );
参考技术B int day[12]=31,28,31,30,31,30,31,31,30,31,30,31;
if(year%4==0&&year%100!=0 or year%400==0)//闰年
day[1]++;
其实您是可以用那个自 1970年1月1日来毫秒数来对比相减再除于一定格式的时间就可以知道想距多少时间了 参考技术C * 判断平闰年方法
*/
public void pingrunnian()
int year = 0;
//从组件处得到年份(这里是用下拉菜单做的)
if (jtf3.getSelectedIndex() > 0)
year = (Integer) jtf3.getSelectedItem();
int month = 0;
//从组件处得到月份(这里是用下拉菜单做的)
if (jtf4.getSelectedIndex() > 0)
month = (Integer) jtf4.getSelectedItem();
int day = 0;
switch (month)
//大月
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
//小月
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
if ((0 == year % 400) || (0 == year % 4 && 0 != year % 100))
day = 29;
else
day = 28;
break;
//下面的是向组件里添加得到的值的。 上面才是关键
//jtf5.removeAllItems();
//jtf5.addItem("DD");
//for (int i = 1; i <= day; i++)
// jtf5.addItem(i);
C语言求两个日期相差的天数
#include <stdio.h>
int leap_year( int );
int year_days( int );
int days(int,int,int);
int leap_year( int year ) // 判断闰年或平年
return ( (year%4==0 && year%100!=0) || year%400==0 ) ? 1 : 0;
int year_days(int year) // 计算一整年的天数
return leap_year( year ) ? 366 : 365;
int days( int year, int month, int day ) // 计算该天month,day 是本年year的第几天
int months[13] = 0,31,28,31,30,31,30,31,31,30,31,30,31, i;
if ( leap_year( year ) && month >2 )
day++;
for ( i=1; i<month; i++ )
day += months[i];
return day;
int main()
int year1,month1,day1,year2,month2,day2,t,p,k,i;
scanf("%d%d%d",&year1,&month1,&day1);
scanf("%d%d%d",&year2,&month2,&day2);
p=365*(year2-year1);
for(i=1;i<(year2-year1);i++)
k=year1;
if(leap_year(k)==1)p++;k++;
t=days(year2,month2,day2)-days(year1,month1,day1)+p;
if(t==1)printf("1 day\n");
else printf("%d days\n",t);
不知道哪错了,求指点T^T
要考虑闰年的情况,判断闰年的口诀:4年一闰,100年不闰,400年再闰。
((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
网上找了一个(偷懒= =!),修改下如下:
#include <stdio.h>
int sum(int y,int m,int d)
unsigned char x[13]=0,31,28,31,30,31,30,31,31,30,31,30,31;
int i,s=0;
for(i=1;i<y;i++)
if(i%4==0 && i%100!=0 || i%400==0)
s+=366;//闰年
else
s+=365;//平年
if(y%4==0 && y%100!=0 || y%400==0)
x[2]=29;
for(i=1;i<m;i++)
s+=x[i];//整月的天数
s+=d;//日的天数
return s;//返回总天数,相对公元1年
void main()
unsigned char y1,m1,d1,y2,m2,d2;
int s1,s2;
printf("输入第一个年 月 日:");
scanf("%d %d %d",&y1,&m1,&d1);
printf("输入第二个年 月 日:");
scanf("%d %d %d",&y2,&m2,&d2);
s1=sum(y1,m1,d1);
s2=sum(y2,m2,d2);
if (s1 > s2)
printf("相差天数:%ld\n",s1-s2);
else
printf("相差天数:%ld\n",s2-s1);
以上代码VC6编译测试通过。
虽然这个思路显得有些笨,但是其它算法,代码太长太复杂,要考虑多种情况,不如直接算两个日期距离公元元年1月1日的天数,然后相减 参考技术A
你好!
你的程序运行正常的,是不是你输入数据的时候格式有问题
参考技术B for循环里面k始终是year1。本回答被提问者采纳
以上是关于java计算两个时间相隔月数,考虑闰年的主要内容,如果未能解决你的问题,请参考以下文章