Ответ МакДауэлла правильный, но классы java.util.Calendar
(и java.util.Date
) устарели.
java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии и обратно портирована на Java 6 и 7 и на Android. Эти новые классы вытесняют старые классы даты и времени, поскольку они доказали, что они плохо спроектированы, сбивают с толку и создают проблемы.
Instant
- текущий момент в UTC.
Instant now = Instant.now();
Применить часовой пояс ZoneId
, чтобы получить ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
часовой пояс против локали
Обратите внимание, что часовой пояс и Locale
являются ортогональными проблемами. Часовой пояс влияет на настенные часы , смещение от UTC . Locale
влияет только на презентацию. Локаль используется для (а) человеческого языка в качестве названия дня и месяца и (б) культурных норм, касающихся таких вопросов, как месяц до дня месяца, запятая или период и т. Д.
Например, у вас может быть пользователь, читающий по-французски Québécois , имеющий доступ к вашей странице во время работы в India . Поэтому используйте часовой пояс Asia/Kolkata
с Locale.CANADA_FRENCH
.
Для генерации форматированной строки используйте класс DateTimeFormatter
. Многие примеры уже существуют в переполнении стека. Укажите желаемый / ожидаемый Locale
с помощью withLocale
метода.