System.currentTimeMillis () хороший выбор для этого? - PullRequest
1 голос
/ 23 сентября 2011

Я до сих пор не уверен, как работает 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 ]

2 голосов
/ 23 сентября 2011

System.currentTimeMillis () никогда не сбрасывается в 0. Это число миллисекунд с начала эпохи, в полночь 1 января 1970 года.

Этот подход хорош, и часто, как вы выяснили, математику легче выполнять за миллисекунды.

Ссылка: http://download.oracle.com/javase/6/docs/api/

edit: хорошая точка Spycho, ответ currentTimeMillis () основан на системных часах, а не на магии, поэтому изменение системного времени на пару дней назад приведет к уменьшению числа. Но не в обычной практике.

Если вы используете время для запрета пользователей, вы, вероятно, захотите использовать службу NTP для поддержания правильности системных часов (если вы этого еще не сделали).

1 голос
/ 23 сентября 2011

Вы можете установить постоянный счетчик перезагрузки (или счетчик перезапуска программы) (в дБ или в файле), чтобы различать метки времени, записанные в разных сеансах загрузки.

И затем запишите свою метку времени, используя комбинацию System.currentTimeMillis () и значения счетчика

Если счетчики перезагрузки отличаются для двух временных отметок, вы можете использовать их иначе, чем в обычных случаях. Может быть, запуск процедуры синхронизации времени или что-то.

1 голос
/ 23 сентября 2011

Вы можете использовать комбинацию этого в дополнение к записи файла в систему и сохранению временной метки / связанной информации в файле

1 голос
/ 23 сентября 2011

System.currentTimeMillis() - это всегда фактическое время в миллисекундах с полуночи 1 января 1970 года по Гринвичу, согласно местной системе. Если вы измените время на машине, выход System.currentTimeMillis() также изменится. То же самое применимо, если вы измените часовой пояс машины, но оставите время без изменений. System.currentTimeMillis() никогда не сбрасывается в ноль (если вы не измените время машины на то, которое было в часовом поясе машины в 00: 00: 00.000 1 января 1970 года).

System.currentTimeMillis() должно быть хорошо для того, что вы хотите сделать.

1 голос
/ 23 сентября 2011

Если этот код работает на стороне сервера, с вами все будет в порядке.

Из-за високосных секунд (или ручных изменений часов) время на сервере может изменить, но это не должноне меняйте это так сильно, что это действительно имеет значение, если запрет отменяется слишком рано.

Вы, конечно, должны убедиться, что сервер настроен на получение своего времени через NTP, так что он всегдамаксимально точный и правильно настроенный при перезагрузке.

1 голос
/ 23 сентября 2011

System.currentTimeMillis() может вернуться (или прыгнуть вперед), если системные часы изменились.

0 голосов
/ 03 января 2013

просто протестируйте этот код.измените время во время выполнения этого кода.

System.currentTimeMillis () прекращает печать, когда установлено системное время.

начинает печать снова, когда time> time_before_setting_back

    while (true){
        System.out.println(System.currentTimeMillis());
        try {
            Thread.sleep(1000);
        } catch ( InterruptedException e ) {
            e.printStackTrace();
        }
    }
0 голосов
/ 23 сентября 2011

Альтернативой может быть использование System.nanoTime (), потому что а) он более точен и б) монотонно увеличивается. Однако работать с нано-секундами немного более громоздко, и вряд ли это что-то изменит, если ваши системные часы сильно не изменяются на секунды или более. (В этом случае у вас могут возникнуть другие проблемы)

0 голосов
/ 23 сентября 2011

При использовании System.currentTimeMillis() вы получаете время Системы, другими словами, время машины, на которой вы запускаете свой код.Таким образом, когда вы перезапустите компьютер, вы все равно получите время, которое будет увеличиваться, даже если машина точно выключена.

Но если вы измените время машины, System.currentTimeMillis() даст вам новое время, время, которое вы изменили.Поэтому, когда время изменилось, вы получите неправильное время.

Я использовал это во многих классах, не задумываясь о смене часов.Вы можете просто использовать его только с этим риском.Но я считаю, что это очень хороший выбор для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...