Как я могу добраться, текущая локальная стена показывают время (в количестве millis с 1 января 1970) в Лондоне? Так как мое приложение может работать на сервере в любом месте, я думаю, что должен использовать TimeZone "Европы/Лондона". Я также должен принять Переход на летнее время во внимание, т.е. приложение должно добавить час в течение "лета".
Я предпочел бы использовать стандарт java.util библиотеки.
Это корректно?
TimeZone tz = TimeZone.getTimeZone("Europe/London") ;
Calendar cal = Calendar.getInstance(tz);
return cal.getTime().getTime() + tz.getDSTSavings();
Спасибо
Я не уверен, что представляет собой это количество, поскольку "число миллисекунд с 1 января 1970 года" не зависит от местоположения или перехода на летнее время. Но, возможно, этот расчет будет вам полезен:
TimeZone london = TimeZone.getTimeZone("Europe/London");
long now = System.currentTimeMillis();
return now + london.getOffset(now);
Для большинства приложений лучше использовать либо время UTC, либо местное время; на самом деле это ни то, ни другое. Вы можете получить время UTC и время в определенной зоне следующим образом:
Instant now = Instant.now(); /* UTC time */
ZonedDateTime local = now.atZone(ZoneId.of("Europe/London"));
Другие говорили, что это может быть не очень хорошей идеей - я считаю, что это зависит от вашей ситуации, но использование UTC, безусловно, стоит рассмотреть.
Однако, я думаю, вы кое-что упустили: количество секунд, прошедших с 1 января 1970 года UTC (именно так всегда определяется эпоха в Unix - и фактически это то же самое, что и в Лондоне, поскольку смещение на эту дату было равно 0), можно получить с помощью любого из этих выражений:
System.currentTimeMillis()
new Date().getTime()
Calendar.getInstance().getTime().getTime()
Если подумать, количество миллисекунд с этого конкретного момента не меняется в зависимости от того, в каком часовом поясе вы находитесь.
О, и обычное предложение - для гораздо лучшего API даты и времени, смотрите Joda Time.