2016-11-25 14 views
0

Мне нужно отформатировать дату строки с заданным часовым поясом и вернуть объект даты обратно. Я сейчас в часовом поясе IST.Формат даты Строка с часовым поясом и возврат Объект даты

So IST - 5 часов и 30 минут больше, чем UTC.

public void getDate(){ 
    String dateStr = "11/25/2016T13:30:00.000"; 
    String dateFormat = "MM/dd/yyyy'T'HH:mm:ss.SSS"; 
    Date date = formatedStringToDate(dateStr, dateFormat); 
    System.out.println(date); 
} 

public static Date formatedStringToDate(final String date, final String dateFormat) throws ParseException { 
     final SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
     sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
     Date parsedDate = null; 
     if (date != null) { 
      try { 
       parsedDate = sdf.parse(date); 
      } catch (ParseException e) { 
       throw e; 
      } 
     } 
     return parsedDate; 
} 

Получаю нижнее белье.

Fri Nov 25 19:00:00 **IST** 2016 

время, кажется, переход от 5,30 часов, но затем, если его IST к UCT времени converstion, он должен быть 5.30 часов до 13:30:00, которая 8:00:00?

Также как я могу изменить выделенную часть IST из строки put, чтобы отобразить в данный момент часовой пояс?

+1

№ Индия Стандартное время (IST) - 5:30 часов до согласованного времени в мире (UTC). Итак, поскольку ваша дата составляет 13:30 UTC, а IST - 5:30 вперед, 13:30 UTC = 19:00 IST. Дата не имеет часового пояса. Это всего лишь универсальный момент времени, который хранится как несколько миллисекунд с другого точного момента. Чтобы отформатировать его в формате UTC, используйте SimpleDateFormat, чей часовой пояс установлен в UTC, как и тот, который вы использовали для синтаксического анализа строки (но вы, конечно же, получите исходную строку). –

+0

@JBNizet спасибо. Итак, теперь это мое понимание. dateStr - это просто строковое значение без какого-либо часового пояса. Поэтому я хочу получить объект Date, преобразовывая время в заданный часовой пояс. Итак, в этом примере я установил sdf.setTimeZone (TimeZone.getTimeZone («UTC»)); Тогда у меня не должно быть никакого преобразования времени, потому что моя dateStr находится в UTC, и я устанавливаю UTC также в моем SimpleDateFormat – Harshana

ответ

2

При вызове toString на Date (напечатав его), вы получите формат по умолчанию в (потому что Date это объект, который хранит число миллисекунд, или наносекунд в Java 9+, с эпохи). Чтобы увидеть результат в формате UTC вам нужно что-то подобное,

final DateFormat sdf = DateFormat.getDateTimeInstance(DateFormat.FULL, 
     DateFormat.FULL); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
Date date = formatedStringToDate(dateStr, dateFormat); 
System.out.println(sdf.format(date)); // <-- format the Date 
+0

. Что касается моего любопытства, они действительно меняют точность java.util.Date в Java 9, хотя он уже в основном устарел в пользу java.time API? –

+1

@JBNizet Я слышал, что они были, но теперь я не могу найти первичный источник. Я полагаю, что это связано с реализацией 'Date', public api не изменяется (независимо от того, как Java внутренне определяет эпоху). –

+0

@ElliottFrisch Спасибо за это. Фактически я печатаю его только для моей цели, и я понимаю, что более важно значение миллисекунды, которое получает назначение в конструкторе Date. Поэтому в этом случае предположим, что у меня есть дата строки со временем, как в моем примере dateStr = «11/25/2016T13: 30: 00.000» в UTC (в строке нет информации о часовом поясе, поэтому по умолчанию ее UTC справа) и Я хочу преобразовать его вовремя для данного часового пояса. например: PST, UTC, IST и т. д. Что я мог бы сделать дополнительно в своем примере в сообщении кода в вопросе? – Harshana

0

ТЛ; дг

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.

 Смежные вопросы

  • Нет связанных вопросов^_^