Java内置日期操作和比较

时间:2014-05-28 14:52:48

标签: java date

我希望创建一个日期时间戳,然后再添加10个小时,然后进行线程检查以查看时间是否已过去。

我通读了Time comparison,但对于这么简单的事情来说似乎有点复杂/错综复杂。特别是如果你的时间比较跨越午夜。

我的理解是java的底层日期时间,假设是一个很长的,如果这是真的,是否有一种简单的方法来添加另一个long,例如相当于10个小时的数字?或者其他一些方法,比如添加两个日期?

注意:解决方案需要成为核心java的一部分,不能成为第三方库的一部分。

4 个答案:

答案 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()可让您直接获取“现在”即时消息,而无需使用DateCalendar等等。

然后可以操作时间戳基本数学:

 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

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类似的问题。