java.time
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
.withLocale(Locale.US);
ZonedDateTime dayBeforeYesterday = ZonedDateTime.now(ZoneId.of("America/St_Thomas"))
.minusDays(2);
System.out.println(dayBeforeYesterday.format(formatter));
Запуск только сейчас, я получил этот вывод:
5/7/18, 8:44
Пожалуйста, укажите желаемый часовой пояс, в который я поместил America / St_Thomas. Подумайте дважды, прежде чем использовать ZoneId.systemDefault()
для настройки часового пояса JVM, поскольку этот параметр может быть изменен в любое время в других частях вашей программы или в других программах, работающих в той же JVM; но если вы доверяете настройке, отражающей часовой пояс пользователя, это правильная вещь.
Вместо того, чтобы определять свой собственный формат вывода, предпочтите использовать один из встроенных форматов, которые вы получаете из DateTimeFormatter.ofLocalizedDateTime
. Укажите локаль (независимо от того, используете ли вы встроенный формат или катите свой собственный). Опять же, используйте Locale.getDefault()
, если вы уверены, что настройка JVM верна.
Избегайте старых классов даты и времени, таких как Calendar
, DateFormat
и SimpleDateFormat
. Они не только давно устарели, но и плохо спроектированы, а последние два особенно печально известны. Сегодня у нас намного лучше в java.time
, современном Java-API даты и времени.
Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time
.