Использует ли java.util.Date TimeZone? - PullRequest
       16

Использует ли java.util.Date TimeZone?

23 голосов
/ 04 октября 2009

У меня 2 разных компьютера, каждый с разной TimeZone.

На одном компьютере я печатаю System.currentTimeMillis(), а затем печатает следующую команду на обоих компьютерах: System.out.println(new Date(123456)); -> 123456 обозначает число, пришедшее в currentTimeMillis на компьютере № 1.

Второй отпечаток (хотя напечатан жестко) приводит к разным отпечаткам на обоих компьютерах. почему это?

Ответы [ 5 ]

49 голосов
/ 06 октября 2009

Как насчет педантичных деталей?

java.util.Date не зависит от часового пояса. Так говорит прямо в javadoc.

Вы хотите что-то относительно определенного часового пояса? Это java.util.Calendar .

Хитрая часть? Когда вы печатаете этот материал (с java.text.DateFormat или подкласс ), это включает Календарь (который включает часовой пояс). См. DateFormat.setTimeZone () .

Он выглядит (не проверял реализацию), как java.util.Date.toString (), проходящий через DateFormat. Так что даже наш (в основном) независимый от часового пояса класс путается с часовыми поясами.

Хотите получить этот часовой пояс из наших чистых объектов Date без зоны? Date.toGMTString () . Или вы можете создать свой собственный SimpleDateFormatter и использовать setTimeZone (), чтобы контролировать, какая зона используется самостоятельно.

7 голосов
/ 04 октября 2009

почему это?

Потому что что-то вроде «4 октября 2009, 14:20» не имеет смысла, не зная часового пояса, на который он ссылается, - который вы, скорее всего, увидите прямо сейчас, потому что это мое время, когда я пишу это, и оно, вероятно, отличается на несколько часов из вашего времени, хотя это тот же момент времени.

Компьютерные метки времени обычно измеряются в UTC (в основном это часовой пояс Гринвича, Англия), и часовой пояс необходимо учитывать при форматировании их во что-то удобочитаемое человеком.

5 голосов
/ 04 октября 2009

Потому что это число миллисекунд - это количество миллисекунд после 1/1/1970 UTC. Если затем вы переводите в другой часовой пояс, отображаемое время будет другим.

например. 123456 может соответствовать полудню в Гринвиче (UTC). Но это будет другое время в Нью-Йорке.

Чтобы подтвердить это, используйте SimpleDateFormat с выводом часового пояса и / или измените часовой пояс на втором компьютере, чтобы он соответствовал первому.

2 голосов
/ 11 января 2013

Javadoc объясняет это хорошо, System.currentTimeMillis () Обратите внимание, что хотя единица времени возвращаемого значения составляет миллисекунду, степень детализации значения зависит от базовой операционной системы и может быть больше. Например, многие операционные системы измеряют время в десятках миллисекунд.

2 голосов
/ 04 октября 2009

См. https://docs.oracle.com/javase/7/docs/api/java/util/Date.html#toString().

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

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