Я не нахожу способ изменить дату по Гринвичу
Я получаю "params.date" одну строку в формате "yyyyMMdd", так что это мой поток:
Date date = new SimpleDateFormat('yyyyMMdd').parse(params.data)
System.out.println(sdf.parse(params.data))
Вывод:
Thu Nov 17 21:00:00 GMT-03:00 2022
А мне нужно:
Thu Nov 17 21:00:00 GMT-00:00 2022
Кто-нибудь может мне помочь?
Ваш ввод - это дата, а не дата и время. Дата не имеет часового пояса. Как вы думаете, почему 20221117 должно означать девять часов вечера 17 ноября?
@ThomasBehr В моей базе данных есть данные «2022-11-19T02:00:00.000+00:00», и они учитывают то же самое, что и «2022-11-18T23:59:00.000-03:00»,
@GustavoSilvaCosta Хорошо, мой вопрос должен был указать вам на тот факт, что вы указали свой формат даты как yyyyMMdd, что означает, что есть информация о дне, месяце и году, но не о времени дня. Конечно, это не работает, если ваши входные данные не соответствуют формату разбора. В любом случае следуйте совету, данному MarkRotteveel и ArvindKumarAvinash: используйте java.time.
Я настоятельно рекомендую вам не использовать SimpleDateFormat и Date. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйте LocalDate и DateTimeFormatter, оба из java.time, современного API даты и времени Java.
Я не могу воспроизвести. Например, я могу получить Fri Nov 18 00:00:00 GMT-03:00 2022, но не могу получить 21:00:00 из кода, который вы показали. Должно быть что-то еще, чего вы еще не опубликовали. Пожалуйста, если мы хотим помочь, дайте нам минимальный воспроизводимый пример.
Несколько важных моментов:
java.util.Date
отображается со смещением часового пояса по умолчанию. Обратите внимание, что java.util.Date
не представляет реальную дату-время, а скорее дает вам количество миллисекунд от эпохи, а затем реализация Date#toString
применяет системный часовой пояс для отображения строки.SimpleDateFormat
устарели и подвержены ошибкам. Рекомендуется полностью прекратить их использование и перейти на современный API даты и времени.Демонстрация с API java.time:
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String data = "20221118";
LocalDate date = LocalDate.parse(data, DateTimeFormatter.BASIC_ISO_DATE);
ZonedDateTime zdt1 = date.atStartOfDay(ZoneOffset.UTC);
ZonedDateTime zdt2 = zdt1.withZoneSameInstant(ZoneOffset.of("-03:00"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss 'GMT'xxx uuuu",
Locale.ENGLISH);
System.out.println(formatter.format(zdt2));
System.out.println(formatter.format(zdt1));
}
}
Вывод:
Thu Nov 17 21:00:00 GMT-03:00 2022
Fri Nov 18 00:00:00 GMT+00:00 2022
Узнайте больше о современном API Date-Time из Trail: Date Time.
Сам Date не имеет формата (кроме формата по умолчанию, реализованного в его методе toString(), который использует ваш часовой пояс по умолчанию). Если вам нужен другой формат, вам также необходимо использовать средство форматирования для форматирования даты, которую вы хотите. Кроме того, пожалуйста, прекратите использовать устаревшие классы, такие как java.util.Date, и переключитесь на более совершенные классы в java.time.