Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中获得以年为单位的时差_Java_Android_Date - Fatal编程技术网

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." );