java 求两个日期差几个月
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 求两个日期差几个月相关的知识,希望对你有一定的参考价值。
有两个GregorianCalendar日期,计算他们之间差几个月,结果保存为double。
转换成毫秒的形式可以计算差多少天是没错,但是用毫秒判断月份是有误差的吧,因为月份不是每个月都30(或31)天。求一个合理解决方案,比如2012-11-24 14:20:00和2012-5-24 14:20:00应该正好得出6.0
import java.util.Calendar;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.io.PrintStream;
public class DateDiffMonth
public static void main(String [] argv) throws Exception
System.out.println(getMonthDiff("1900-10-21", "1901-01-01"));
/**
* 得到两日期相差几个月
*
* @param String
* @return
*/
public static long getMonthDiff(String startDate, String endDate) throws ParseException
long monthday;
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
Date startDate1 = fmt.parse(startDate);
Calendar starCal = Calendar.getInstance();
starCal.setTime(startDate1);
int sYear = starCal.get(Calendar.YEAR);
int sMonth = starCal.get(Calendar.MONTH);
int sDay = starCal.get(Calendar.DAY_OF_MONTH);
Date endDate1 = fmt.parse(endDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate1);
int eYear = endCal.get(Calendar.YEAR);
int eMonth = endCal.get(Calendar.MONTH);
int eDay = endCal.get(Calendar.DAY_OF_MONTH);
monthday = ((eYear - sYear) * 12 + (eMonth - sMonth));
//这里计算零头的情况,根据实际确定是否要加1 还是要减1
if (sDay < eDay)
monthday = monthday + 1;
return monthday;
天以下,要自己添加判断 参考技术A 你可以如此计算,
年份差、月份差算出整数部分
小数部分再按剩余日期、时分秒按其在当月的比例计算
如2012-11-24 14:20:00和2012-5-24 14:20:00
年差为0,月差为6,其他差为0,结果为6.0
若其中出现某差为负数,需调整
如2012-11-24 14:20:00和2012-5-31 14:20:00
年差为0,月差为6,日差为-6,将月差改为5,
即先计算和2012-6-24 14:20:00的差,
2012-6-24 14:20:00到2012-5-31 14:20:00再计算,
可按6月份2012-6-24 14:20:00到2012-6-01 00:00:00 占6月份比例
再计算5月份2012-5-31 24:00:00到2012-5-31 14:20:00占5月份比例
两个比例加起来是小数部分。本回答被提问者采纳 参考技术B 使用joda-time:
DateTime from = new DateTime(2012, 11, 24 ,14 , 20 , 0);
DateTime to = new DateTime(2012, 5 , 24 , 14, 20 , 0);
int months = Months.monthsBetween(from,to).getMonths(); // -6
C语言中 求两个日期间的天数
想知道C语言中是否提供这样的函数,求出两个日期之间的天数?
如果没有现成的函数能用,想知道如何写代码实现这个功能?
请赐教,谢谢。
这怎么能直接相减 ,年份要判断一下吧,月份也要判断吧
要把年、月、日分开来求...
#include <stdio.h>
int mon[12]=31,28,31,30,31,30,31,31,30,31,30,31; /*储存12个月的天数*/
void main()
int spec_year(int);
void scan(int *year,int *month,int *day);
long com_year(int y1,int y2);
int com_month(int y1,int m1,int y2,int m2);
int com_day(int y1,int m1,int d1,int y2,int m2,int d2);
int year1,month1,day1;
int year2,month2,day2;
long sum=0;
int k=0;
/*输入两个日期,做合法性检查*/
printf("Enter the first date,like 1988 11 30:");
scan(&year1,&month1,&day1);
printf("Enter the second date,like 1988 11 30:");
scan(&year2,&month2,&day2);
/*当输入的第一个日期比第二个日期大时,将二者对换*/
if((year1>year2)||((year1==year2)&&(month1>month2))||((year1==year2)&&(month1==month2)&&(day1>day2)))
int temp;
temp=year1;year1=year2;year2=temp;
temp=month1;month1=month2;month2=temp;
temp=day1;day1=day2;day2=temp;
/*计算两个日期之间的天数*/
sum+=com_year(year1,year2); /*计算两个年份之间的天数*/
sum+=com_month(year1,month1,year2,month2); /*计算两个月份之间的天数*/
sum+=com_day(year1,month1,day1,year2,month2,day2); /*计算两天之间的天数*/
/*输出*/
printf("There are %ld days between them.\n",sum);
void scan(int *year,int *month,int *day) /*输入日期函数,合法性判断*/
int k=0;
do
if(k!=0)
printf("\nWrong date!\n");
k++;
/*printf("Please write down the day,like 1988 11 30:");*/
scanf("%d%d%d",year,month,day);
if(spec_year(*year))
mon[1]=29;
while(*day>mon[*month-1]||*month>13||*year<1900||*year>3000);
mon[1]=28;
long com_year(int y1,int y2) /*计算两个年份之间的天数*/
int i;
long sum=0;
for(i=y1+1;i<y2;i++)
if(spec_year(i))
sum+=366;
else
sum+=365;
return sum;
int com_month(int y1,int m1,int y2,int m2) /*计算两个月份之间的天数*/
int i;
int sum=0;
if(y1!=y2)
if(spec_year(y1))
mon[1]=29;
if(m1!=m2)
for(i=m1;i<12;i++)
sum+=mon[i];
mon[1]=28;
if(spec_year(y2))
mon[1]=29;
for(i=0;i<m2-1;i++)
sum+=mon[i];
mon[1]=28;
else
for(i=m1-1;i<12;i++)
sum+=mon[i];
mon[1]=28;
if(spec_year(y2))
mon[1]=29;
for(i=0;i<m2-1;i++)
sum+=mon[i];
mon[1]=28;
else
if(spec_year(y1))
mon[1]=29;
for(i=m1;i<m2-1;i++)
sum+=mon[i];
mon[1]=28;
return sum;
int com_day(int y1,int m1,int d1,int y2,int m2,int d2) /*计算两天之间的天数*/
int i;
int sum=0;
if(m1!=m2)
if(spec_year(y1))
mon[1]=29;
sum+=(mon[m1-1]-d1);
sum+=d2;
mon[1]=28;
else
sum+=d2-d1;
return sum;
int spec_year(int year) /*判断是否为闰年*/
if((year%400==0)||((year%4==0)&&(year%100!=0)))
return 1;
else
return 0;
参考技术A 不记得有类似的库函数,应该相减就能出结果。如果返回值不是 int 型就加个强制类型转换,应该很容易。
呵呵,我记错了。抱歉。C 语言没有日期变量。
这样的话,就八仙过海,各显其能了。楼下已经给出不少代码了,我就不现丑了。
以上是关于java 求两个日期差几个月的主要内容,如果未能解决你的问题,请参考以下文章