我希望创建一个日期时间戳,然后再添加10个小时,然后进行线程检查以查看时间是否已过去。
我通读了Time comparison,但对于这么简单的事情来说似乎有点复杂/错综复杂。特别是如果你的时间比较跨越午夜。
我的理解是java的底层日期时间,假设是一个很长的,如果这是真的,是否有一种简单的方法来添加另一个long,例如相当于10个小时的数字?或者其他一些方法,比如添加两个日期?
注意:解决方案需要成为核心java的一部分,不能成为第三方库的一部分。
答案 0 :(得分:3)
您可以使用Calendar来执行该数学运算,
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 10); // Add 10 hours.
Date date2 = cal.getTime(); // Now plus 10 hours.
Date date = new Date(); // Now.
答案 1 :(得分:2)
您可以使用Date.getTime()
方法获取基础时间戳,时间戳基本上是自定义的基本时刻(1970-01-01 00:00:00 IIRC)以来经过的毫秒数。
System.currentTimeMillis()
可让您直接获取“现在”即时消息,而无需使用Date
,Calendar
等等。
然后可以操作时间戳基本数学:
timestamp += TimeUnit.MILLISECONDS.convert(10, TimeUnit.HOURS);
添加10小时的示例:
long nowInMilliSince1970 = System.currentTimeMillis();
long tenHoursAsMilli = TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES);
long tenHoursLater = nowInMilliSince1970 + tenHoursAsMilli;
System.out.println("now in milliseconds: \t\t" + nowInMilliSince1970);
System.out.println("10 hours in milliseconds: \t" + tenHoursAsMilli);
System.out.println("10 hours from now: \t\t" + tenHoursLater);
检查时间戳是否过去非常简单:
if (timestamp < System.currentTimeMillis()) {
System.out.println("timestamp is in the past");
}
请注意,直接时间戳数学没有夏令时和时区的概念。如果你想要这样,使用一个日历进行数学运算 - Calendar
实现脏的例外规则。
答案 2 :(得分:1)
使用JDK内置的东西实现它的另一种方法是:
long tenHoursFromNow = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(10);
然后在你的主题中你会检查:
if(System.currentTimeMillis() > tenHoursFromNow)
{
//Do something as the time has elapsed
}
虽然我认为使用Calendar和Date可以更清楚地了解代码的用途是什么。
答案 3 :(得分:0)
捆绑的java.util.Date和.Calendar非常麻烦。他们真的应该避免。
您声明要求不添加库。所以请参阅我的答案中的 java.time 部分,使用新添加到Java 8的新软件包。但我建议您重新考虑不愿意添加库,特别是如果您还不能迁移到Java 8 ; j.u.Date/Calendar真的那么糟糕。
两个库都处理夏令时等异常。
考虑指定时区而不是依赖于JVM的默认值。通常最好在UTC中工作,然后转换为本地时区以便呈现给用户。
java.time package新添加到Java 8。灵感来自Joda-Time,但重新设计。由JSR 310定义。由threeten-extra项目扩展。
ZonedDateTime tenHoursLater = ZonedDateTime.now().plusHours( 10 );
使用Joda-Time 2.3库。
DateTime tenHoursLater = DateTime.now().plusHours( 10 );
有关使用Joda-Time的更多信息,请参阅my answer类似的问题。