Преобразование строки в формате T-Z в Date

Возможное решение: Преобразование даты Java в другое время как формат даты

Я прошел через него, но не получил ответа.

У меня есть строка " 2013-07-17T03: 58: 00.000Z", и я хочу преобразовать ее в дату той же формы, которую мы получаем при создании новой Date(). d = новая дата();

Время должно быть в IST.Zone-Asia/Kolkata​​p >

Таким образом, дата для строки выше должна быть

Ср июл 17 12:05:16 IST 2013//Независимо от времени по индийскому стандарту GMT + 0530

String s="2013-07-17T03:58:00.000Z";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
TimeZone tx=TimeZone.getTimeZone("Asia/Kolkata");
formatter.setTimeZone(tx);
d= (Date)formatter.parse(s);

Ответ 1

Используйте календарь для часовых поясов.

TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
Calendar cal = Calendar.getInstance(tz);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
sdf.setCalendar(cal);
cal.setTime(sdf.parse("2013-07-17T03:58:00.000Z"));
Date date = cal.getTime();

Для этого, однако, я бы рекомендовал Joda Time, поскольку он имеет лучшие функции для этой ситуации. Для JodaTime вы можете сделать что-то вроде этого:

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
DateTime dt = dtf.parseDateTime("2013-07-17T03:58:00.000Z");
Date date = dt.toDate();

Ответ 2

A Дата не имеет часового пояса. Если вы хотите узнать, какое строковое представление даты указана в индийском часовом поясе, используйте другой SimpleDateFormat с его часовым поясом, установленным в Indian Standard, и отформатируйте дату с помощью этого нового SimpleDateFormat.

EDIT: образец кода:

String s = "2013-07-17T03:58:00.000Z";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date d = formatter.parse(s);

System.out.println("Formatted Date in current time zone = " + formatter.format(d));

TimeZone tx=TimeZone.getTimeZone("Asia/Calcutta");
formatter.setTimeZone(tx);
System.out.println("Formatted date in IST = " + formatter.format(d));

Выход (текущий часовой пояс - Париж - GMT + 2):

Formatted Date in current time zone = 2013-07-17T05:58:00.000+02
Formatted date in IST = 2013-07-17T09:28:00.000+05

Ответ 3

java.time

Я хотел бы дать современный ответ. И дайте вам предложение: вместо того, чтобы воспроизводить то, что вам дал бы Date.toString(), лучше использовать встроенный формат для пользователей в соответствующей локали:

    String isoString = "2013-07-17T03:58:00.000Z";
    String humanReadable = Instant.parse(isoString)
            .atZone(userTimeZone)
            .format(localizedFormatter);
    System.out.println(humanReadable);

На моем компьютере это печатает

17 July 2013 at 09.28.00 IST

В моем фрагменте используется несколько констант

private static final ZoneId userTimeZone = ZoneId.of("Asia/Kolkata");
private static final DateTimeFormatter localizedFormatter = DateTimeFormatter
        .ofLocalizedDateTime(FormatStyle.LONG)
        .withLocale(Locale.getDefault(Locale.Category.FORMAT));

Вызов withLocale избыточен, когда мы просто передаем языковой стандарт по умолчанию. Я вложил его, чтобы у вас было место для предоставления явного языка, если ваши пользователи нуждаются в другом. У него также есть хорошее преимущество, заключающееся в том, чтобы сделать явным, что результат зависит от языка, в случае, если кто-то, читающий ваш код, не подумал об этом.

Я использую java.time, современный Java-интерфейс даты и времени. С этим гораздо лучше работать, чем с устаревшими Date, TimeZone и печально известными DateFormat и SimpleDateFormat. Ваша строка соответствует стандарту ISO 8601, формат, который современные классы анализируют как по умолчанию, то есть без явного форматирования.

Тот же формат, что и Date, дал вам

Конечно, вы можете иметь тот же формат, что и старомодный Date, если вы этого потребуете. Просто замените форматир выше:

private static final DateTimeFormatter asUtilDateFormatter 
        = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);

Теперь получим:

Wed Jul 17 09:28:00 IST 2013

Ссылка на учебник

Подробнее об использовании java.time в учебнике Oracle и/или найти другие ресурсы там.