Как изменить +0800 на +0000 в Java?

Как изменить 2018-12-24 12:00:00 +0800 на 2018-12-23 16:00:00 +0000 в Java?

private String currentDateandTime = new Date();

final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
final DateFormat fullFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss XX", Locale.CHINA);
//dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
//fullFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

Date dateTest = dateFormat.parse(currentDateandTime);
currentDateandTime = fullFormat.format(dateTest);

currentDateanTime Результат

2018-12-24 12:00:00 +0800

person Lester    schedule 24.12.2018    source источник
comment
Возможный дубликат Как узнать местное время разных часовых поясов?, а именно этот ответ   -  person MTCoster    schedule 24.12.2018
comment
Что ты хочешь изменить? 1. распечатать его в часовом поясе GMT ​​(+0000)? 2. Предположим, что время указано в часовом поясе GMT ​​(т.е. игнорирует часовой пояс +0800), и распечатать его?   -  person Archit    schedule 24.12.2018
comment
2018-12-24 12:00:00 +0800 и 2018-12-23 16:00:00 +0000 это не одно и то же мгновение !!!   -  person xingbin    schedule 24.12.2018
comment
Я рекомендую вам избегать класса SimpleDateFormat. Это не только давно устарело, но и доставит много хлопот. Сегодня у нас намного лучше java.time, современный API даты и времени Java.   -  person Ole V.V.    schedule 27.12.2018
comment
Я не могу воспроизвести вашу проблему. Вместо этого я получаю «Несоответствие типов: невозможно преобразовать дату в строку».   -  person Ole V.V.    schedule 27.12.2018
comment
Возможный дубликат Преобразование строки даты (EST) в дату Java (UTC) и многие другие вопросы.   -  person Ole V.V.    schedule 27.12.2018


Ответы (3)


Если вы хотите получить один и тот же экземпляр в разных часовых поясах, вы можете сделать это следующим образом:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z");
OffsetDateTime offsetDateTime = OffsetDateTime.parse("2018-12-24 12:00:00 +0800", formatter);
ZonedDateTime dateTimeInDesiredZoned = offsetDateTime.atZoneSameInstant(ZoneId.of("UTC"));
// 2018-12-24 04:00:00 +0000
System.out.println(formatter.format(dateTimeInDesiredZoned)); 

Однако 2018-12-24 12:00:00 +0800 и 2018-12-23 16:00:00 +0000 - это не одно и то же мгновение. Между ними 12-часовой интервал, вам нужно минус эти 12 часов.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z");
OffsetDateTime offsetDateTime = OffsetDateTime.parse("2018-12-24 12:00:00 +0800", formatter);
offsetDateTime = offsetDateTime.minusHours(12);
ZonedDateTime dateTimeInDesiredZoned = offsetDateTime.atZoneSameInstant(ZoneId.of("UTC"));
// 2018-12-23 16:00:00 +0000
System.out.println(formatter.format(dateTimeInDesiredZoned)); 
person xingbin    schedule 24.12.2018
comment
О, я вижу. но мой текущий уровень API ниже 26. Я не могу использовать OffsetDateTime - person Lester; 24.12.2018

Что ж, ваш код начинается с проблемы.

private String currentDateandTime = new Date();

Предполагая, что Date() импортирован отсюда java.util.Date

В этой строке должна отображаться ошибка компилятора

В любом случае, я предполагаю, что вы хотите преобразовать свой LocalTimezone DateTime в GMT Date Time

Date currentDate = new Date();
System.out.println(currentDate);

final DateFormat gmtFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
gmtFormatter.setTimeZone(TimeZone.getTimeZone("GMT"));
String convertedDate = gmtFormatter.format(currentDate);
System.out.println(convertedDate);

OUTPUT:
Mon Dec 24 09:52:14 IST 2018
2018-12-24 04:22:14
person MyTwoCents    schedule 24.12.2018

необходимо установить часовой пояс «GMT» (+0000) для fullFormat, чтобы преобразовать часовой пояс по умолчанию для использования часового пояса GMT:

Date currentDateandTime = new Date();

final DateFormat fullFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss XX", Locale.CHINA);
TimeZone gmtTime = TimeZone.getTimeZone("GMT");
fullFormat.setTimeZone(gmtTime);
String currentDateandTimeInGMTFullFormat = fullFormat.format(currentDateandTime);
person m fauzan abdi    schedule 24.12.2018