Java 在android中获得以年为单位的时差
你好,我能得到秒,分,小时和天,但当我试图得到年的问题来了 我正在使用以下代码:Java 在android中获得以年为单位的时差,java,android,date,Java,Android,Date,你好,我能得到秒,分,小时和天,但当我试图得到年的问题来了 我正在使用以下代码: Calendar startDate = new GregorianCalendar(year, month, day); Calendar date = Calendar.getInstance(); long diff = date.getTimeInMillis() - startDate.getTimeInMillis();
Calendar startDate = new GregorianCalendar(year, month, day);
Calendar date = Calendar.getInstance();
long diff = date.getTimeInMillis() - startDate.getTimeInMillis();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
double years = date.get(Calendar.YEAR) - startDate.get(Calendar.YEAR);
假设开始日期为1994年7月25日,结束日期为2015年7月28日
我得到的结果是21.0,而不是20.97。我需要得到用户的确切年龄(以年为单位),所以;你们能帮我吗?。谢谢 使用BigDecimal而不是double和long。当需要精确计算浮点数时,请始终使用BigDecimal。浮点数学在java中不可靠。简单的例子是System.out.println2.00-1.10;猜猜看,它不会打印。90。您需要转换变量:
double years = (double) date.get(Calendar.YEAR) - (double) startDate.get(Calendar.YEAR);
你的问题是关于经过的时间还是关于十进制数的计算 如果是第一个,你应该知道过去几年的十进制数字有点奇怪。如果是第二个问题,您应该更改问题的标题 经过的时间 对于Android,您应该使用库而不是旧的java.util.Date/.Calendar类。旧的阶级是出了名的麻烦 该标准定义了各种日期时间值的字符串格式。对于以年、月、日、小时、分钟和秒为单位的时间跨度,格式为P定义开始,T将天部分与小时部分分开。问题是关于P21Y3D的跨度,即21年零3天。Joda时间库使用此标准格式来解析和生成此类字符串
LocalDate start = new LocalDate( 1994, 7, 25 ); // 07/25/1994
LocalDate stop = new LocalDate( 2015, 7, 28 ); // 07/28/2015
Period period = new Period( start, stop );
System.out.println("start: " + start + " to stop: " + stop + " is " + period );
跑步的时候
开始时间:1994-07-25停止时间:2015-07-28是P21Y3D
十进制数计算
如果您只是询问十进制数,那么Samrat Dutta的说法是正确的:如果您关心精度,请使用。否则,您将在浮点计算中使用原语。在执行速度上权衡准确性。作为一般规则,如果对解决业务问题的方法有疑问,请使用BigDecimal而不是浮点
你说的确切年龄是什么意思?以下是小数点后200位以内的年份数:
21.0075290896646132785763175906913073237508555783709778165639972621492128678986995208761225188227241615161531964407976728268309371389459727446941409915537303216974880218062970568103832991020
跑步的时候
天数:7673÷365.25=21.00752908966461327857631759069130732375085557837097781656399726214921286789869952087612251882272427161531964407976728230937713894597274469414099931553730321697488028062970568103832991020年。
正如我所说,您可能会发现P21Y3D比这个十进制数字更有意义。您能使用Joda Time吗?这肯定会让生活变得更简单……如果你使用长文本和整数文本,你怎么会认为你可以得到浮点数呢?至于Android的库,我想:
Integer days = Days.daysBetween( start, stop ).getDays( );
BigDecimal daysPerYear = new BigDecimal( 365.25 ); // Approximate.
int scale = 200; // Number of fractional digits desired.
BigDecimal years = new BigDecimal( days ).divide( daysPerYear, scale, RoundingMode.HALF_EVEN ); // Banker's rounding.
System.out.println( "days: " + days + " ÷ " + daysPerYear + " = " + years + " years." );