大家好,
求java 方法 计算出两日期的 月差及日差
比如 : 开始日:2011/03/17 结束日 2012/02/13 两个日期 月差为 10, 日差 为 28
谢谢大家!
这个还真有点麻烦,说明见注释,做了个测试示例:
[code="java"]
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class CalculateDateTest {
public static void main(String[] args) {
DateCalculate dateCalculate = DateCalculate.calculate("2011/03/17", "2012/02/13");
System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
System.out.println();
dateCalculate = DateCalculate.calculate("2011/03/30", "2011/04/13");
System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
System.out.println();
dateCalculate = DateCalculate.calculate("2011/03/31", "2011/04/13");
System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
System.out.println();
dateCalculate = DateCalculate.calculate("2011/03/17", "2011/04/18");
System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
System.out.println();
dateCalculate = DateCalculate.calculate("2011/03/17", "2012/01/13");
System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
System.out.println();
dateCalculate = DateCalculate.calculate("2011/03/31", "2012/03/13");
System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
System.out.println();
dateCalculate = DateCalculate.calculate("2011/03/31", "2012/05/13");
System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
System.out.println();
}
}
/**
@author lxbccsu
*日期比较差值不包括起始日期,包括最后日期
*/
class DateCalculate{
private long differenceOfMonths;//月份差值
private long differenceOfDays;//天数差值
static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
public static DateCalculate calculate(String startdate, String endDate){
try {
return calculate(dateFormat.parse(startdate),dateFormat.parse(endDate));
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
@return
*/
public static DateCalculate calculate(Date startDate, Date endDate){
if(startDate.after(endDate)) return null;
System.out.println("开始日:" + dateFormat.format(startDate) + ", 结束日: "+ dateFormat.format(endDate));
DateCalculate dataCalculate = new DateCalculate();
Calendar firstDay = Calendar.getInstance();
Calendar lastDay = Calendar.getInstance();
firstDay.setTime(startDate);
lastDay.setTime(endDate);
//算出天数总差值
long allDays = ((lastDay.getTimeInMillis()) - (firstDay.getTimeInMillis()))/(1000*24*60*60);
Calendar loopEndDay = calculateLoopEndOfDate(firstDay,lastDay);
System.out.println("循环终止日期 : " + dateFormat.format(loopEndDay.getTime()));
dataCalculate.setDifferenceOfDays(0);
dataCalculate.setDifferenceOfMonths(0);
int month = firstDay.get(Calendar.MONTH);
while(!firstDay.equals(loopEndDay)){
firstDay.add(Calendar.DAY_OF_MONTH, 1);
allDays--;
if(month != firstDay.get(Calendar.MONTH)){
month = firstDay.get(Calendar.MONTH);
dataCalculate.setDifferenceOfMonths(dataCalculate.getDifferenceOfMonths()+1);
}
}
dataCalculate.setDifferenceOfDays(allDays);
return dataCalculate;
}
/**
@return
*/
private static Calendar calculateLoopEndOfDate(Calendar startDate, Calendar endDate) {
int year = endDate.get(Calendar.YEAR);
int month = endDate.get(Calendar.MONTH);
int day = startDate.get(Calendar.DAY_OF_MONTH);
int maxDaysInMonth = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));
if(year > startDate.get(Calendar.YEAR)){
if(month == Calendar.JANUARY){
year -= 1;
month = Calendar.DECEMBER;
}else{
if(day > maxDaysInMonth){
month -= 1;
endDate.set(year, month, 1);
day = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));
}else{
if(day > endDate.get(Calendar.DAY_OF_MONTH)){
month -= 1;
endDate.set(year, month, 1);
maxDaysInMonth = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));;
if(day > maxDaysInMonth){
day = maxDaysInMonth;
}
}
}
}
}else{
if(day > maxDaysInMonth){
month -= 1;
endDate.set(year, month, 1);
day = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));
}else{
if(day > endDate.get(Calendar.DAY_OF_MONTH)){
month -= 1;
endDate.set(year, month, 1);
maxDaysInMonth = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));
if(day > maxDaysInMonth){
day = maxDaysInMonth;
}
}
}
}
return new GregorianCalendar(year, month, day);
}
/**
public long getDifferenceOfMonths() {
return differenceOfMonths;
}
public void setDifferenceOfMonths(long differenceOfmonths) {
this.differenceOfMonths = differenceOfmonths;
}
public long getDifferenceOfDays() {
return differenceOfDays;
}
public void setDifferenceOfDays(long differenceOfDays) {
this.differenceOfDays = differenceOfDays;
}
}
[/code]
Calendar类 会用吧.
直接设置这两个时间段的Calendar对象 c1.getTime - c2.getTime
相减获得时间设置
可以将结果设置到c3
然后使用c3获得月 --相差月
获得日期将c3.getTime --毫秒数
/1000/60/60/24 --相差天数了
Calendar很容易用. java自己的类
嗖嗖 Calendar 方法 吧,一下你就会明白了.
[code="java"]
/**
@return 两个日期相差天数
*/
public static long getIntervalDays(String sd, String ed) {
return ((java.sql.Date.valueOf(ed)).getTime() - (java.sql.Date
.valueOf(sd)).getTime())
/ (3600 * 24 * 1000);
}
/**
起始年月yyyy-MM与终止月yyyy-MM之间跨度的月数。
@param beginMonth
格式为yyyy-MM
@param endMonth
格式为yyyy-MM
@return 整数。
*/
public static int getInterval(String beginMonth, String endMonth) {
int intBeginYear = Integer.parseInt(beginMonth.substring(0, 4));
int intBeginMonth = Integer.parseInt(beginMonth.substring(beginMonth
.indexOf("-") + 1));
int intEndYear = Integer.parseInt(endMonth.substring(0, 4));
int intEndMonth = Integer.parseInt(endMonth.substring(endMonth
.indexOf("-") + 1));
return ((intEndYear - intBeginYear) * 12)
[code="java"]
static Calendar getCalendar(String time)
{
if (null == time)
{
return null;
}
String[] times = time.split("/");
Calendar calendar = Calendar.getInstance();
calendar.set(Integer.valueOf(times[0]), Integer.valueOf(times[1]), Integer.valueOf(times[2]));
return calendar;
}
public static void main(String[] args)
{
String startTime1 = "2011/03/17";
String startTime2 = "2012/02/13";
Calendar c1 = getCalendar(startTime1);
Calendar c2 = getCalendar(startTime2);
System.out.println("月相差:"+(c2.get(Calendar.MONTH)-c1.get(Calendar.MONTH)+12));
System.out.println("日相差:"+(c1.getMaximum(Calendar.DAY_OF_MONTH)-c1.get(Calendar.DAY_OF_MONTH)+c2.get(Calendar.DAY_OF_MONTH)));
}
[/code]
[code="java"]
static Calendar getCalendar(String time)
{
if (null == time)
{
return null;
}
String[] times = time.split("/");
Calendar calendar = Calendar.getInstance();
calendar.set(Integer.valueOf(times[0]), Integer.valueOf(times[1]), Integer.valueOf(times[2]));
return calendar;
}
public static void main(String[] args)
{
String startTime1 = "2011/03/17";
String startTime2 = "2010/03/13";
Calendar c1 = getCalendar(startTime1);
Calendar c2 = getCalendar(startTime2);
System.out.println("日相差:"
+ (c1.getMaximum(Calendar.DAY_OF_MONTH) - c1.get(Calendar.DAY_OF_MONTH) + c2.get(Calendar.DAY_OF_MONTH)));
int month = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH);
if (month == 0)
{
if (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR) == 0)
{
System.out.println("月相差 :0 ");
}
if (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR) > 0)
{
System.out.println("月相差 :12 ");
}
if (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR) < 0)
{
System.out.println("月相差 :-12 ");
}
}
else if (month > 0)
{
System.out.println("月相差:" + (c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH)));
}
else if (month < 0)
{
System.out.println("月相差:" + (c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH) + 12));
}
}
[/code]
上面代码有问题,可以试试这个。
可以用 时间戳···
public class Test {
static String date1 = "2011/03/17";
static String date2 = "2012/02/13";
/**
* 转换字符串日期 为时间戳(long)
* @param strTime
* @return
*/
public static Long parseStrTime(String strTime){
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
Long time = null;
try {
time = df.parse(strTime).getTime();
} catch (ParseException e) {
System.out.println("时间戳转换错误!");
e.printStackTrace();
}
return time;
}
public static void main(String[] args) {
long longNum = Test.parseStrTime(Test.date2) - Test.parseStrTime(Test.date1);
long oneDaylong = 24*60*60*1000;
long dayNum = longNum/oneDaylong;
System.out.println("相差的天数:" + dayNum);
System.out.println("相差的月数:" + dayNum/30);
}
运行结果:
相差的天数:333
相差的月数:11
[b]下面这段代码应该能解决你的问题[/b]
[code="java"]
package com.ebiz.framework.util;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class test
{
public static String BEFORE = "-"; //减少天数
public static String AFTER = "+"; //增加天数
/**
* 取得相隔数量的【日或者月】的日期
* @param date 指定日期
* @param type BEFORE:往前,AFTER:往后
* @param interval 相隔的日或者月,格式为 14D/12M【相隔14日/相隔12月】
*/
public static Date getIntervalDate(Date date,String type,String intervalString){
try {
int interval = Integer.valueOf(intervalString.substring(0, intervalString.length() - 1));
String dayOrMonth = intervalString.substring(intervalString.length() - 1);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
if ("S".equals(dayOrMonth.toUpperCase()))
{
if (test.BEFORE.equals(type)) cal.add(Calendar.SECOND, -interval);
if (test.AFTER.equals(type)) cal.add(Calendar.SECOND, +interval);
}
else if ("I".equals(dayOrMonth.toUpperCase()))
{
if (test.BEFORE.equals(type)) cal.add(Calendar.MINUTE, -interval);
if (test.AFTER.equals(type)) cal.add(Calendar.MINUTE, +interval);
}
else if ("H".equals(dayOrMonth.toUpperCase()))
{
if (test.BEFORE.equals(type)) cal.add(Calendar.HOUR, -interval);
if (test.AFTER.equals(type)) cal.add(Calendar.HOUR, +interval);
}
else if ("D".equals(dayOrMonth.toUpperCase()))
{
if (test.BEFORE.equals(type)) cal.add(Calendar.DATE, -interval);
if (test.AFTER.equals(type)) cal.add(Calendar.DATE, +interval);
}
else if ("M".equals(dayOrMonth.toUpperCase())){
if (test.BEFORE.equals(type)) cal.add(Calendar.MONTH, -interval);
if (test.AFTER.equals(type)) cal.add(Calendar.MONTH, +interval);
}
else if ("Y".equals(dayOrMonth.toUpperCase())){
if (test.BEFORE.equals(type)) cal.add(Calendar.YEAR, -interval);
if (test.AFTER.equals(type)) cal.add(Calendar.YEAR, +interval);
}
return cal.getTime();
}
catch (Exception e)
{
return null;
}
}
public static void main(String[] main)
{
for(int i = 1;i<=6; i++)
{
System.out.println(new SimpleDateFormat("M").format(getIntervalDate(new Date(),"-",i+"m"))+"月");
}
}
}
[code="java"][/code]
[/code]
new DateCalculate().calculate("2014-01-28", "2014-3-01"); 二月好像处理不了