定义方法为:
int [] getDateLength(String fromDate, String toDate)
将结果保存在一个整型数组中:{年, 月, 日}使用方法及执行结果:
getDateLength("2007531", "20070601"); {0, 0, 1}
getDateLength("2007531", "20070631"); {0, 1, 0}
getDateLength("2007531", "20080531"); {1, 0, 0}
getDateLength("2007531", "20080601"); {1, 0, 1}我知道可以用IBM的icu4j_2_8.jar中的Calendar.fieldDifference(),但是我希望只用JDK自带的类解决此问题,请各位给出一个能够保证效率的解决办法。
int [] getDateLength(String fromDate, String toDate)
将结果保存在一个整型数组中:{年, 月, 日}使用方法及执行结果:
getDateLength("2007531", "20070601"); {0, 0, 1}
getDateLength("2007531", "20070631"); {0, 1, 0}
getDateLength("2007531", "20080531"); {1, 0, 0}
getDateLength("2007531", "20080601"); {1, 0, 1}我知道可以用IBM的icu4j_2_8.jar中的Calendar.fieldDifference(),但是我希望只用JDK自带的类解决此问题,请各位给出一个能够保证效率的解决办法。
然后相减就是毫秒差,利用毫秒差计算对应的年月日时分秒
计算方法就是用那个毫秒/1000就是秒…………………………可能效率方面达不到要求吧。在楼主找不到方法的情况下可以顶一下。呵呵
{
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println(format(getDateLength("20070531", "20070601")));
System.out.println(format(getDateLength("20070531", "20070630")));
System.out.println(format(getDateLength("20070531", "20080531")));
System.out.println(format(getDateLength("20070531", "20080601")));
}
static int[] getDateLength(String from, String to)
{
java.text.DateFormat df = new java.text.SimpleDateFormat("yyyyMMdd");
java.util.Calendar c1 = java.util.Calendar.getInstance();
java.util.Calendar c2 = java.util.Calendar.getInstance();
try
{
c1.setTime(df.parse(from));
c2.setTime(df.parse(to));
} catch (java.text.ParseException e)
{
// XXX Auto-generated catch block
System.err.println("日期格式不正确,应该是yyyyMMdd");
e.printStackTrace();
}
int[] result = new int[3];
result[0] = (c2.get(java.util.Calendar.YEAR) - c1.get(java.util.Calendar.YEAR)) < 0 ? 0 : c2
.get(java.util.Calendar.YEAR)
- c1.get(java.util.Calendar.YEAR);
result[1] = (c2.get(java.util.Calendar.MONTH) - c1.get(java.util.Calendar.MONTH)) < 0 ? 0 : c2
.get(java.util.Calendar.MONTH)
- c1.get(java.util.Calendar.MONTH);
result[2] = (c2.get(java.util.Calendar.DAY_OF_MONTH) - c1.get(java.util.Calendar.DAY_OF_MONTH)) < 0 ? 0 : c2
.get(java.util.Calendar.DAY_OF_MONTH)
- c1.get(java.util.Calendar.DAY_OF_MONTH);
return result;
}
static String format(int[] result)
{
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < result.length - 1; i++)
sb.append(result[i] + ",");
sb.append(result[result.length - 1] + "]");
return sb.toString();
}
}
都是一些基本得API方法,看看API文档都能写出来!
?
第一组结果应该为[0,0,1]这个也不算错误,这要看lz的需求是什么样的,按照你说的那么20060530和20060630既可以是[0,1,0]也可以是[0,0,30]呢
例如,我输入20070528和20080302,得到的结果是{1, 2, 26},我想要的结果是{0, 9, 3}。
过程解释:
20070528经过0年9个月到达20080228,且2008年是闰年,二月是大月,20080228再过3天到达预定值。
如果我输入20080528和20090302,那得到的结果就应该是{0, 9, 2}。
http://icu.sourceforge.net/
//----------------------------
import java.util.Calendar;public class Y {
public static void main(String[] args) {
int ret[] = getDateLength("20050531", "20070101");
System.out.println(ret[0] + ":" + ret[1] + ":" + ret[2]);
} static int[] getDateLength(String fromDate, String toDate) {
Calendar c1 = getCal(fromDate);
Calendar c2 = getCal(toDate);
int[] p1 = { c1.get(Calendar.YEAR), c1.get(Calendar.MONTH), c1.get(Calendar.DAY_OF_MONTH) };
int[] p2 = { c2.get(Calendar.YEAR), c2.get(Calendar.MONTH), c2.get(Calendar.DAY_OF_MONTH) };
return new int[] { p2[0] - p1[0], p2[0] * 12 + p2[1] - p1[0] * 12 - p1[1], (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (24 * 3600 * 1000)) };
} static Calendar getCal(String date) {
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Integer.parseInt(date.substring(0, 4)), Integer.parseInt(date.substring(4, 6)) - 1, Integer.parseInt(date.substring(6, 8)));
return cal;
}
}
关键是月的差值,可以用等价的概念把年退到月,比如2007年1月,等价于2006年13月,同理等价于0年(2007*12+1)月。
这样y1年m1月到y2年m2月 分别等价于0年(y1*12+m1)月和0年(y2*12-m2)月
月份之差就是:y2*12+m2-y1*12-m1
long between = 0;
try {
java.util.Date begin = dfs.parse("2009-07-10 10:22:21.214");
java.util.Date end = dfs.parse("2009-07-20 11:24:49.145");
between = (end.getTime() - begin.getTime());// 得到两者的毫秒数
} catch (Exception ex) {
ex.printStackTrace();
}
long day = between / (24 * 60 * 60 * 1000);
long hour = (between / (60 * 60 * 1000) - day * 24);
long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000
- min * 60 * 1000 - s * 1000);
System.out.println(day + "天" + hour + "小时" + min + "分" + s + "秒" + ms
+ "毫秒"); 你自己改改,就能用了。。