java.time
Вы сказали, что не можете использовать современный API даты и времени, но для других читателей я хотел бы сначала представить эту опцию. SimpleDateFormat
и Date
плохо спроектированы и сильно устарели, первые особенно печально известны, поэтому я рекомендую избегать их.
Я предполагаю, что BST относится к британскому летнему времени (существуют другие интерпретации). И я предполагаю, что вы не можете избежать получения старомодного Date
объекта.
private static DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("EEE dd MMM yyyy HH:mm:ss z", Locale.UK);
private static ZoneId britain = ZoneId.of("Europe/London");
private static ZoneId gmt = ZoneId.of("Etc/GMT");
private static String toGMT(final Date date) {
ZonedDateTime britishTime = date.toInstant().atZone(britain);
ZonedDateTime gmtTime = britishTime.withZoneSameLocal(gmt);
return gmtTime.format(formatter);
}
Попробуйте это с вашим Date
Ср 26 июня 13:30:13 BST 2019:
String textDate = dateFormatLocal.format(date);
System.out.println(textDate);
System.out.println(toGMT(date));
Вывод:
2019-06-26T13:30:13+0100
Wed 26 Jun 2019 13:30:13 GMT
Всякий раз, когда вы получаете старомодный Date
, первое, что нужно сделать, это преобразовать его в Instant
. Затем сделайте дальнейшие преобразования оттуда. Ключом к изменению часового пояса и сохранению даты и времени дня (час-минута-секунда дня) является метод withZoneSameLocal
класса ZonedDateTime
.
Я рекомендую указать локаль для форматера.
Я не уверен, почему это так? Что здесь не так?
A Date
не получил, поскольку не может иметь часовой пояс. Это момент времени, не более того. Ваш метод toGMTDate
возвращает момент времени, который находится на час позже: время, которое вы дали, было 13: 30: 13 + 0100, и он возвратил 13: 30: 13 + 0000, что соответствует моменту времени 14 : 30: 13 + 0100. Затем вы отформатировали этот момент времени, используя средство форматирования, которое использовало ваш часовой пояс по умолчанию, Европа / Лондон, и, следовательно, выдало 14:30:13, но в то же время напечатало GMT
в строке - результат, о котором вы сообщили.
... новая библиотека времени, но по некоторым причинам я не могу их использовать.
Если у вас действительно есть злой босс, который либо заставляет вас использовать Java 1.4 или 1.5 и / или запрещает использование внешних зависимостей, довольно простой взлом:
private String toGMT(final Date date) {
return dateFormatGmtText.format(date);
}
Обман: Ваш dateFormatGmtText
использует ваш часовой пояс по умолчанию, Европа / Лондон, но лежит и печатает GMT
в отформатированной строке. Это дает тот же вывод, что и выше - вывод, который вы просили По сравнению с вашим кодом я просто опускаю преобразование даты.
Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.