Форматирование Java по Гринвичу Дата

Я не нахожу способ изменить дату по Гринвичу

Я получаю "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

Кто-нибудь может мне помочь?

Сам Date не имеет формата (кроме формата по умолчанию, реализованного в его методе toString(), который использует ваш часовой пояс по умолчанию). Если вам нужен другой формат, вам также необходимо использовать средство форматирования для форматирования даты, которую вы хотите. Кроме того, пожалуйста, прекратите использовать устаревшие классы, такие как java.util.Date, и переключитесь на более совершенные классы в java.time.

Mark Rotteveel 18.11.2022 17:55

Ваш ввод - это дата, а не дата и время. Дата не имеет часового пояса. Как вы думаете, почему 20221117 должно означать девять часов вечера 17 ноября?

Thomas Behr 18.11.2022 17:56

@ThomasBehr В моей базе данных есть данные «2022-11-19T02:00:00.000+00:00», и они учитывают то же самое, что и «2022-11-18T23:59:00.000-03:00»,

Gustavo Silva Costa 18.11.2022 18:04

@GustavoSilvaCosta Хорошо, мой вопрос должен был указать вам на тот факт, что вы указали свой формат даты как yyyyMMdd, что означает, что есть информация о дне, месяце и году, но не о времени дня. Конечно, это не работает, если ваши входные данные не соответствуют формату разбора. В любом случае следуйте совету, данному MarkRotteveel и ArvindKumarAvinash: используйте java.time.

Thomas Behr 18.11.2022 18:22

Я настоятельно рекомендую вам не использовать SimpleDateFormat и Date. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйте LocalDate и DateTimeFormatter, оба из java.time, современного API даты и времени Java.

Ole V.V. 18.11.2022 20:28

Я не могу воспроизвести. Например, я могу получить Fri Nov 18 00:00:00 GMT-03:00 2022, но не могу получить 21:00:00 из кода, который вы показали. Должно быть что-то еще, чего вы еще не опубликовали. Пожалуйста, если мы хотим помочь, дайте нам минимальный воспроизводимый пример.

Ole V.V. 18.11.2022 21:18
Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
0
6
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несколько важных моментов:

  1. Чт 17 ноября 21:00:00 GMT-03:00 2022 не равно Чт 17 ноября 21:00:00 GMT-00:00 2022. Дата-время Чт 17 ноября 21:00:00 GMT-03: 00 2022 равно дате-времени пятницы 18 ноября 00:00:00 GMT+00:00 2022, которое можно получить, добавив 3 часа к четвергу 17 ноября 21:00:00 GMT-03:00 2022.
  2. Ваш часовой пояс имеет смещение -03:00, поэтому объект java.util.Date отображается со смещением часового пояса по умолчанию. Обратите внимание, что java.util.Date не представляет реальную дату-время, а скорее дает вам количество миллисекунд от эпохи, а затем реализация Date#toString применяет системный часовой пояс для отображения строки.
  3. API даты и времени java.util и их API форматирования 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.

Другие вопросы по теме