Преобразование строки в формате T-Z в Date
Возможное решение: Преобразование даты Java в другое время как формат даты
Я прошел через него, но не получил ответа.
У меня есть строка " 2013-07-17T03: 58: 00.000Z", и я хочу преобразовать ее в дату той же формы, которую мы получаем при создании новой Date(). d = новая дата();
Время должно быть в IST.Zone-Asia/Kolkatap >
Таким образом, дата для строки выше должна быть
Ср июл 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 и/или найти другие ресурсы там.