确定特定java.util.Date对象代表多少天前最标准,最高效的方法是什么?理想情况下,我希望得到一个代表(可能)分数天前的双倍。
答案 0 :(得分:4)
听起来非常像:
(System.currentTimeMillis() - date.getTime()) / (24 * 60 * 60 * 1000d);
换句话说,找出当前时间和给定日期之间的差异(以毫秒为单位),然后除以一天中的毫秒数。我已经明确地将1000d作为双重文字,以使最终除法在双重算术中起作用。
答案 1 :(得分:2)
java.util
日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。
使用 java.time
(现代日期时间 API)的解决方案:
您可以使用 java.time.Duration
,它以 ISO-8601 standards 为模型,并作为 JSR-310 implementation 的一部分与 Java-8 一起引入,以查找两个瞬间。此外,如果您已经有一个标准 API 来完成这项工作,请避免自己执行计算。
import java.time.Duration;
import java.time.Instant;
public class Main {
public static void main(String[] args) {
// A sample date-time in the past
String strDateTime = "2020-09-10T10:20:30.123456789Z";
Instant past = Instant.parse(strDateTime);
Instant now = Instant.now();
Duration duration = Duration.between(past, now);
long durationInMillis = duration.toMillis();
double days = (double) durationInMillis / Duration.ofDays(1).toMillis();
System.out.println(days);
}
}
样本运行的输出:
299.14329884259257
从 Trail: Date Time 了解有关现代 Date-Time API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 2 :(得分:1)
获取System.currentTimeMillis()
并从中查找日期。然后获取day
,month
,year
。现在应该很容易找到差异。