答案 0 :(得分:4)
你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是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 );
通过调用Comparable
的Duration::compareTo
方法进行比较。
Boolean exceededLimit = ( duration.compareTo( limit ) > 0 );
顺便说一句,拥有一个名为cooldown
的集合和方法是没有用的。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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
类并使用timeAgo
和Calendar
。您可以获得更清晰,更易读的代码。将Instant
个对象放在地图中而不是Duration
中,它们突然不言自明。
答案 4 :(得分:-3)
currentTimeMillis返回:当前时间与1970年1月1日午夜时间之间的差异(以毫秒为单位)
你能解释一下你使用它的原因吗。