Комментарии Натана Хьюза и меня достаточно хороши, чтобы их можно было объединить в ответ: используйте java.time, современный API даты и времени, в частности его DateTimeFormatter
.
public static final DateTimeFormatter printFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
Теперь ваше форматированиенапример, может выглядеть так:
String stringToPrint = LocalDate.parse("2015-02-02")
.atStartOfDay(ZoneOffset.UTC)
.format(printFormatter);
System.out.println(stringToPrint);
Это печатает:
2015-02-02 00: 00: 00
В форматекод преобразования Я пользуюсь тем фактом, что ваша исходная строка 2015-02-02
в формате даты соответствует стандарту ISO 8601.LocalDate
анализирует этот формат как формат по умолчанию, то есть без какого-либо явного средства форматирования.
Что пошло не так в вашем коде?
Из вашего вопроса может показаться, что есть два вероятных объяснениянаблюдаемое вами поведение:
- Один из других классов программы на сервере, использующий два модуля форматирования, устанавливает часовой пояс одного из них, например, Америка / Чикаго.
- Два или более потоков используют форматы одновременно, что приводит к тому, что один из них ведет себя некорректно.
Наблюдаемое поведение, ошибка 6 часов, когда после включения он продолжаетдо перезапуска сервера кажется более совместимым с первым объяснением, которое вы также подтвердили в своем собственном ответе, и спасибо за это.
В отличие от SimpleDateFormat
современный DateTimeFormatter
является поточно-ориентированным, чтопредотвращает любые проблемы с потоками и является неизменным, что не позволяет другим классам изменять форматер.Так что это решает вашу проблему в обоих случаях.
В качестве отступления, я думаю, вы знаете о неправильном использовании строчных букв hh
в строке шаблона формата.hh
- для часов в пределах AM или PM с 01 по 12, тогда как вам нужно прописные буквы HH
для часов дня с 00 до 23 (это относится как к SimpleDateFormat
, так и к DateTimeFormatter
).
Ссылка: Обучающая программа Oracle: Дата и время , объясняющая, как использовать java.time
.