如何计算Java中两个日期之间的年份和月份
我是新手,如果有人帮助我,我会很感激。
当我尝试使用以下来源计算年龄时,它并没有给我我想要的价值。 例如:date-> 29/12/2010,dob-> 30/12/1992,它会给我18而不是17。有什么方法我可以编码返回我17个月11个月基于上述2个日期而不是18yrs0mths?
public double getAgeAsOf( Date date ) { return ((date.getTime() - dob.getTime())/(1000*60*60*24))/365; }
谢谢。
您可以使用Joda Time并使用月份和年份作为单位计算两个LocalDate
值之间的时间段 (这是您在此处获得的值)。
示例代码:
import org.joda.time.*; public class Test { public static void main(String[] args) { LocalDate dob = new LocalDate(1992, 12, 30); LocalDate date = new LocalDate(2010, 12, 29); Period period = new Period(dob, date, PeriodType.yearMonthDay()); System.out.println(period.getYears() + " years and " + period.getMonths() + " months"); } }
(这使用包含天数的句点类型,但这不会影响答案。)
一般来说,Joda Time是比使用日期/日历更好的API – 如果你能避免它,你真的不想自己开始执行日期计算。 它很快变得混乱。
根据aioobe的回答,如果你划分两个整数表达式,算法将以整数运算执行,这可能不是你想要的 – 但对于日期和时间算术,只是让别人在第一时间做艰苦的工作:)
上面的代码将使用ISO-8601日历,这基本上是公历。 如果要使用其他内容,请在LocalDate
的年/月/日之后将其指定为另一个构造函数参数。
您的代码有一些问题:
-
你正在进行整数除法,它将结果截断为最接近的较低整数。
例如,如果你将729除以365,你就会得到1(并且你已经失去了小数部分,这在计算月数时需要)
-
另一个问题是你使用365天一年,而实际上接近365.25(由于闰年包括额外的天数)。
这是一个稍微改进的代码片段:
import java.util.Date; public class Test { static double msPerGregorianYear = 365.25 * 86400 * 1000; static Date dob = new Date(1992, 12, 30); public static double getAgeAsOf(Date date) { return (date.getTime() - dob.getTime()) / msPerGregorianYear; } public static void main(String[] args) { double years = getAgeAsOf(new Date(2010, 12, 29)); // years == 17.99315537303217 int yy = (int) years; int mm = (int) ((years - yy) * 12); // Prints "17 years and 11 moths." System.out.printf("%d years and %d moths.", yy, mm); } }
如果你做的事情比计算毫秒数的年数更复杂,我建议你转到一些时间库,比如Jon Skeet建议的Joda时间 。
- http://10.0.2.2适用于android模拟器但不适用于用作模拟器的android设备
- JRE包括什么?
- 关于create activity的Robolectric 3.0 java.lang.NoSuchMethodException
- 将long(其十进制表示forms表示yyyyMMdd .. date)转换为其他日期格式
- JVM在内存不足错误期间的行为? List s = new ArrayList ();
- 是否可以添加库项目的JAR文件并在其他项目中使用其资源?
- jvm如何进入public static void main?
- 编译错误:非法启动表达式
- 当基类和派生类都具有相同名称的变量时会发生什么