我想获取日历对象实例的时间之间的差异。由于某种原因,我在使用此函数时得到一个负数(-17666324.42)。
对于 overtimeHourLimit,我使用值 8。
/*Date*/
Calendar mDateIn = Calendar.getInstance();
Calendar mDateOut = Calendar.getInstance();
mDateOut.set(mDateOut.YEAR, mDateOut.MONTH, mDateOut.DAY_OF_MONTH, mDateOut.HOUR_OF_DAY+10, mDateOut.MINUTE+25);
public String getRegHours(float overtimeHourLimit)
{
DecimalFormat twoDecimal = new DecimalFormat("0.##");
double totalHours = 0;
totalHours = (mDateOut.getTimeInMillis() - mDateIn.getTimeInMillis()) / (3.6f * Math.pow(10, 6));
if (totalHours <= overtimeHourLimit)
return twoDecimal.format(totalHours);
else return twoDecimal.format(overtimeHourLimit);
}
编辑:将范围缩小到 mDateOut.set() 方法。 @HarshPandey 发现当使用 mDateOut.add() 方法时,它会正确地添加时间。然而,我仍然困惑为什么 .set() 方法一开始不起作用。
编辑2:https://github.com/MienTommy/CalendarTest我推出了一个示例代码,它应该与这个问题中的代码 fragment 等效。唯一的区别是 YEAR、MONTH、DAY_OF_MONTH 常量在 Android 中不是静态的,但应该不会有什么区别,因为我使用相同的实例初始化了它们。
tl;dr .set() 方法未按预期工作。
最佳答案
问题的原因在这里:
mDateOut.set(mDateOut.YEAR, mDateOut.MONTH, mDateOut.DAY_OF_MONTH, mDateOut.HOUR_OF_DAY + 10,
mDateOut.MINUTE + 25);
为了解释:
getTimeInMillis() 正在获取纪元:自 1970 年 1 月 1 日 00:00:00 以来的时间
这个方法:
mDateOut.set ()...
设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。在日历实例中......
但是您将 Calendar 类的常量作为参数传递,因此您将日期设置为 1970 年 1 月 1 日 00:00:00 之前的值
考虑这样做:
mDateOut.set(mDateOut.YEAR, mDateOut.MONTH, mDateOut.DAY_OF_MONTH, mDateOut.HOUR_OF_DAY + 10,
mDateOut.MINUTE + 25);
与这样做是一样的......
mDateOut.set(1, 2, 5, 21, 37);
您可以通过执行以下操作来验证该新值:
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(mDateOut.getTime()));
你将得到输出:
0001-03-05 21:37:40
因此mDateOut实际上是一个过去的日期...
结果是否定的:)
关于java - 从转换毫秒显示小时数显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38386972/