ТЛ; дг
LocalDateTime.parse("2017-11-25T13:30:00.000")
.atZone(ZoneId.of("Asia/Kolkata"))
2017-11-25T13: 30 + 05: 30 [Азия/Калькутта]
java.time
Современный подход использует классы java.time, которые заменили трудные старые устаревшие классы времени.
Проанализируйте свою входную строку как LocalDateTime
с учетом отсутствия индикатора зоны или смещения от UTC.
Предпочтительно использовать стандартный формат ISO 8601 для таких строк. Классы java.time используют стандартные форматы по умолчанию при разборе/генерации строк.
LocalDateTime ldt = LocalDateTime.parse("2017-11-25T13:30:00.000") ;
ldt.toString(): 2017-11-25T13: 30
Если вы уверены, что эта дата время должно было представлять момент по времени на стену часов Индии , затем назначьте часовой пояс для создания объекта ZonedDateTime
.
Указать proper time zone name в формате continent/region
, такие как America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте аббревиатуру 3-4 буквы, такую как EST
или IST
, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).
ZoneId z = ZoneId.of("Asia/Kolkata") ;
ZonedDateTime zdt = ldt.atZone(z) ;
Н.toString(): 2017-11-25T13: 30 + 05: 30 [Азия/Калькутта]
Вы можете настроить другую зону для сравнения.
ZonedDateTime zdtMontreal = zdt.withZoneSameInstant(ZoneId.of("America/Montreal"));
zdtMontreal.toString(): 2017-11-25T03: 00-05: 00 [Америка/Монреаль]
Для разбора/генерации строки в других форматах, таких как тот, в ваш вопрос, используйте классы DateTimeFormatter
или DateTimeFormatterBuilder
. Поиск переполнения стека для получения дополнительной информации, так как они широко освещаются.
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM/dd/uuuu'T'HH:mm:ss.SSS" , Locale.US) ;
Используйте этот форматтер для синтаксического разбора.
LocalDateTime ldt = LocalDateTime.parse("11/25/2016T13:30:00.000" , f) ;
И для генерации.
String output = ldt.format(f) ; // Generate string.
Рассмотрите возможность использования форматов ISO 8601.
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
С JDBC driver, соответствующего JDBC 4.2 или более поздней версии, вы можете обменять java.time объекты непосредственно с базой данных. Нет необходимости в строках или java.sql. * Classes.
Где получить классы java.time?
- Java SE 8, Java SE 9, а затем
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android реализаций пачке классов java.time.
- Для более ранних Android, проект ThreeTenABP адаптируется ThreeTen-Backport (упомянутый выше). См. How to use ThreeTenABP….
ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
№ Индия Стандартное время (IST) - 5:30 часов до согласованного времени в мире (UTC). Итак, поскольку ваша дата составляет 13:30 UTC, а IST - 5:30 вперед, 13:30 UTC = 19:00 IST. Дата не имеет часового пояса. Это всего лишь универсальный момент времени, который хранится как несколько миллисекунд с другого точного момента. Чтобы отформатировать его в формате UTC, используйте SimpleDateFormat, чей часовой пояс установлен в UTC, как и тот, который вы использовали для синтаксического анализа строки (но вы, конечно же, получите исходную строку). –
@JBNizet спасибо. Итак, теперь это мое понимание. dateStr - это просто строковое значение без какого-либо часового пояса. Поэтому я хочу получить объект Date, преобразовывая время в заданный часовой пояс. Итак, в этом примере я установил sdf.setTimeZone (TimeZone.getTimeZone («UTC»)); Тогда у меня не должно быть никакого преобразования времени, потому что моя dateStr находится в UTC, и я устанавливаю UTC также в моем SimpleDateFormat – Harshana