检查时间戳是否超过30秒

时间:2017-04-03 03:31:58

标签: java timestamp unix-timestamp

我正在尝试确定时间戳是否超过30秒,但出于某种原因,当它甚至没有几秒钟时,它会回到30秒以上。

示例:https://ideone.com/KLIIBz

ORDER BY

5 个答案:

答案 0 :(得分:4)

使用java.time

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant start = Instant.now();
…
Instant stop = Instant.now();

Duration为单位捕捉开始和结束之间的时间跨度。

Duration duration = Duration.between( start , stop );

代表你的30秒限制。

Duration limit = Duration.ofSeconds( 30 );

通过调用ComparableDuration::compareTo方法进行比较。

Boolean exceededLimit = ( duration.compareTo( limit ) > 0 );

顺便说一句,拥有一个名为cooldown的集合和方法是没有用的。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:2)

试试这个:

public class JavaApplication11 
{
    public static void main(String[] args)
    {
        // TODO code application logic here
        Calendar now = Calendar.getInstance();
        now.add(Calendar.SECOND, -30);//Set Calendar 30 seconds in the past.

        System.out.println(has30SecsPassed(now));
    }

    static boolean has30SecsPassed(Calendar calendar)
    {
        Long numberOfMilliSec = Calendar.getInstance().getTimeInMillis() - calendar.getTimeInMillis();
        double numberOfSecondsPassed = numberOfMilliSec / 1000.0;
        System.out.println("seconds passed: " + numberOfSecondsPassed);
        return numberOfSecondsPassed >= 30;
    }

}

答案 2 :(得分:1)

此:

Calendar now = Calendar.getInstance();
now.add(Calendar.SECOND, -secondsAgo);
long timeAgo = now.getTimeInMillis();

开销太大或只是在您的应用中获得实际时间戳...您可以致电

System.currentTimeMillis();

并在cooldown.get(id)和timeAgo

之间验证此条件

所以他们遇到 cooldown.get(id) - timeAgo< 30 * 1000 与否......

答案 3 :(得分:1)

要从the code on Ideone that you link to判断,问题是on_redirect是0,而不是30.你在构造函数中将它设置为30,但由于你从不从类创建对象,构造函数是从未执行过secondsAgo是一个静态字段,因此您可以在没有对象且没有初始化的情况下访问它。您只需获得所有secondsAgo字段的初始值,即0。

我在Ideone中看到的输出肯定证实了我的意思。在int形式的所有行中,数字相同或仅相隔1毫秒。即使您从1491194338577 | 1491194338578对象中减去了secondsAgo秒,Calendar也不会比您放入地图的时间戳提前30秒。一毫秒之前。所以不,你没有减去30秒;你减去0秒。

那说我仍然同意Basil Bourque的回答:如果有任何方法可以使用Java 8,那么你应该抛弃timeAgo类并使用timeAgoCalendar。您可以获得更清晰,更易读的代码。将Instant个对象放在地图中而不是Duration中,它们突然不言自明。

答案 4 :(得分:-3)

currentTimeMillis返回:当前时间与1970年1月1日午夜时间之间的差异(以毫秒为单位)

你能解释一下你使用它的原因吗。