Получить время в Лондоне

Как я могу получить текущее время по местным настенным часам (в миллисекундах с 1 января 1970 года) в Лондоне? Поскольку мое приложение может работать на сервере в любом месте, я думаю, мне нужно использовать часовой пояс «Европа/Лондон». Мне также нужно учитывать переход на летнее время, т.е. приложение должно добавить час в течение «лета».

Я бы предпочел использовать стандартные библиотеки java.util.

Это верно?

TimeZone tz = TimeZone.getTimeZone("Europe/London") ;
Calendar cal = Calendar.getInstance(tz);
return cal.getTime().getTime() + tz.getDSTSavings();

Спасибо


person dogbane    schedule 29.03.2010    source источник
comment
Если вы пишете сервер, общая парадигма всегда заключается в том, чтобы использовать внутреннее время UTC, а затем форматировать его с помощью DateFormatter при отображении в пользовательском интерфейсе.   -  person Kylar    schedule 29.03.2010
comment
@Kylar: использование только UTC не относится к серверным приложениям, но должно выполняться практически любым приложением.   -  person Joey    schedule 29.03.2010
comment
Я бы не претендовал на то, чтобы знать все приложения;)   -  person Kylar    schedule 29.03.2010
comment
Я не знал, что люди в Лондоне используют настенные часы, которые показывают метки времени Unix.   -  person Mark Byers    schedule 29.03.2010
comment
Звоните +44 871 789 3642. Вам расскажут. (en.wikipedia.org/wiki/Speaking_clock#United_Kingdom)   -  person Ben Zotto    schedule 29.03.2010


Ответы (3)


Я не уверен, что представляет собой это количество, поскольку «количество миллисекунд с 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"));
person erickson    schedule 29.03.2010

Другие говорят, что это может быть не очень хорошей идеей - я считаю, что это зависит от вашей ситуации, но использование UTC, безусловно, следует учитывать.

Однако я думаю, что вы кое-что здесь упустили: количество секунд, прошедших с 1 января 1970 года UTC (именно так всегда определяется эпоха Unix — и на самом деле оно такое же, как в Лондоне, поскольку смещение на эту дату было равно 0) можно получить с помощью любого из этих выражений:

System.currentTimeMillis()
new Date().getTime()
Calendar.getInstance().getTime().getTime()

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

О, и нормальное предложение - гораздо лучший API даты и времени см. Joda Time.

person Jon Skeet    schedule 29.03.2010
comment
Разве Великобритания не использует летнее время? В этом случае он фактически отличается от UTC. - person Joey; 29.03.2010
comment
@Johannes Rössel: DST или нет, количество (милли) секунд, прошедших с начала эпохи, не связано с переходом на летнее время. Если это 6 вечера или 7 вечера, НЕ меняет количество (милли) секунд, прошедших с эпохи. Минуты не являются фиксированной единицей (у вас может быть 59 или 61 секунда), дни не являются фиксированной единицей (у вас может быть 23 или 25 часов в сутках), но секунды и миллисекунды являются фиксированной единицей. Именно поэтому вы всегда должны измерять время в (милли)секундах и хранить даты/время в (милли)секундах с начала эпохи. И делать преобразование только при отображении их конечному пользователю. - person SyntaxT3rr0r; 29.03.2010

Чтобы узнать текущее время в Лондоне:

SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
f.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(f.format(GregorianCalendar.getInstance().getTime()));
person Marcus Leon    schedule 01.04.2011