System.currentTimeMillis()是一个不错的选择吗?

时间:2011-09-23 11:58:01

标签: java time

我仍然不确定System.currentTimeMillis()是如何工作的,但我想将它用于游戏服务器来处理禁止的帐户。

例如,在数据库中,我将在用户的数据中使用“bannTime”(System.currentTimeMillis()+ How_much_time_to_ban_in_ms)。

当用户登录时,它将始终使用以下内容检查是否正常:

if(bannTime==-1)return;

if(System.currentTimeMillis()>bannTime){
    // It's ok you can long in
    removeBanFromDataBase();
}else{
    // You can not login, you have to wait: (bannTime - System.currentTimeMillis())
    return;
}

我需要知道的是:

只要代码始终在一台机器上运行,这样使用System.currentTimeMillis()是否安全?即使我重新启动机器,System.currentTimeMillis()也会继续增加并且永远不会返回或从零开始?从不?

如果我在机器上更改当地时间和日期,System.currentTimeMillis()也会改变?

9 个答案:

答案 0 :(得分:2)

System.currentTimeMillis()永远不会重置为0.这是自大纪元以来的毫秒数,回溯到1970年1月1日午夜。

这种方法很好,而且你会发现,用毫秒来做数学通常更容易。

参考:http://download.oracle.com/javase/6/docs/api/

编辑:好点Spycho,currentTimeMillis()响应是基于系统时钟,而不是魔术,所以将系统时间改回几天会使数量减少。但不是正常的做法。

如果您正在使用时间禁止用户,您可能需要使用NTP服务来保持系统时钟正确(如果您还没有)。

答案 1 :(得分:1)

如果系统时钟发生变化,

System.currentTimeMillis()可能会返回(或跳跃)。

答案 2 :(得分:1)

如果此代码在服务器端运行,那么您应该没问题。

由于闰秒(或手动时钟更改),服务器上的时间可以发生变化,但它不应该变化太大,以至于如果过早撤销禁令实际上很重要

当然,您应该确保服务器设置为通过NTP获取时间,以便它始终尽可能准确,并在重新启动时正确设置。

答案 3 :(得分:1)

根据当地系统,

System.currentTimeMillis()始终是自1970年1月1日午夜以来的实际时间,以毫秒为单位。如果您更改机器上的时间,System.currentTimeMillis()的输出也会更改。如果您更改机器的时区但保持时间不变,则同样适用。 System.currentTimeMillis()永远不会重置为零(除非您将机器的时间更改为1970年1月1日00:00:00000时机器时区的任何时间)。

System.currentTimeMillis()对于您想要做的事情应该没问题。

答案 4 :(得分:1)

除了在系统上写入文件并将时间戳/相关信息存储在文件中之外,您还可以使用它的组合

答案 5 :(得分:1)

您可能希望设置一个“重启计数器(或程序重启计数器)”,它是持久的(在数据库或文件中),以区分在不同启动会话中记录的时间戳。

然后通过System.currentTimeMillis()和计数器值的组合记录您的时间戳

当两个时间戳的重新启动计数器不同时,您可以采用与正常情况不同的方式处理它。也许启动时间同步程序或其他东西。

答案 6 :(得分:0)

使用System.currentTimeMillis()时,您将获得系统的时间,换言之,您运行代码的机器的时间。因此,当您重新启动机器时,即使机器已关闭,您仍将获得增加的时间。

但是当你改变机器的时间时,System.currentTimeMillis()会给你新的时间,你改变的时间。所以当时间改变你会得到错误的时间。

我在很多课程中都使用过这个,而不用担心改变时钟问题。只有这种风险才能使用它。但我发现这是一个非常好的选择。

答案 7 :(得分:0)

另一种方法是使用System.nanoTime(),因为a)它更准确,b)它单调增加。然而,它在纳秒内工作稍微麻烦一点,并且它不太可能产生任何真正的差别,除非你的系统时钟变化很大或几秒钟。 (在这种情况下,您可能会遇到其他问题)

答案 8 :(得分:0)

只测试此代码。 在运行此代码时更改时间。

System.currentTimeMillis()在设置系统时间后停止打印。

当时间>它再次开始打印time_before_setting_back

    while (true){
        System.out.println(System.currentTimeMillis());
        try {
            Thread.sleep(1000);
        } catch ( InterruptedException e ) {
            e.printStackTrace();
        }
    }