2010-11-17 3 views
9

У меня есть строка в шаблоне yyyy-MM-dd hh: mm a , и я могу получить объект часового пояса отдельно, в котором указанная строка представляет дату.Преобразование строки на дату с часовым поясом

Я хочу, чтобы преобразовать это в нижестоящий формат. yyyy-MM-dd HH: mm: ss Z

Как я могу это сделать?

+0

http://joda-time.sourceforge.net/ делает все манипуляции с датами в java намного проще – NimChimpsky

+0

@ Emil, я узнал эту функцию после того, как вы сказали :), спасибо. – John

+1

FYI, проект [Joda-Time] (http://www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/wiki/Maintenance_mode), с команда, предлагающая перейти на классы [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –

ответ

5

Использование SimpleDateFormat

String string1 = "2009-10-10 12:12:12 "; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z") 
sdf.setTimeZone(tz); 
Date date = sdf.parse(string1); 
+0

несколько раз getID() возвращает строку, подобную этой «Америка/Аргентина/Ушуайя». Итак, как я могу использовать его – John

+0

-1: это вызовет ParseException на большинстве часовых поясов. –

+0

@Michael Konietzka @shal Я спешу, я пропустил это, обновил ответ –

0

Создать новый экземпляр SimpleDateFormat с помощью шаблона даты. Впоследствии вы можете вызвать метод parse для преобразования строк даты в объект java.util.Date.

16

Вы можете использовать SimpleDateFormat с yyyy-MM-dd HH:mm:ss и явным образом установить TimeZone:

public static Date getSomeDate(final String str, final TimeZone tz) 
    throws ParseException { 
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm a"); 
    sdf.setTimeZone(tz); 
    return sdf.parse(str); 
} 

/** 
* @param args 
* @throws IOException 
* @throws InterruptedException 
* @throws ParseException 
*/ 
public static void main(final String[] args) throws ParseException { 
    final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); 
    System.out.println(sdf.format(getSomeDate(
     "2010-11-17 01:12 pm", TimeZone.getTimeZone("Europe/Berlin")))); 
    System.out.println(sdf.format(getSomeDate(
     "2010-11-17 01:12 pm", TimeZone.getTimeZone("America/Chicago")))); 
} 

Печатает:

2010-11-17 13:12:00 +0100

2010- 11-17 20:12:00 +0100

Update 2010-12-01: Если вы хотите явно распечатай специальный TimeZone, установите его в SimpleDateFormat:

sdf.setTimeZone(TimeZone .getTimeZone("IST")); 
System.out.println(sdf.format(getSomeDate(
    "2010-11-17 01:12 pm", TimeZone.getTimeZone("IST")))); 

который печатает 2010-11-17 13:12:00 +0530

+0

Спасибо Mr.Michael, дата и время меняются в соответствии с часовым поясом. Примечание: +100, он не меняет смещение TIMEZONE – John

+0

@shal : Извините, я не понимаю вашего второго предложения. Вы считаете, что что-то не так? –

+0

@ Майкл, я говорю, что время преобразуется правильно, но см. Часть «Z» в значениях даты, напечатанных «+0100», она не изменяется. Например, если я конвертирую дату из GMT в IST, Z "часть преобразованной даты должна быть« +0530 ». – John

0

Несомненно, формат, который обычно используется будет быть в форме 2014-10-05T15:23:01Z (TZ)

для этого нужно использовать этот код

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
String dateInString = "2014-10-05T15:23:01Z"; 

try { 

    Date date = formatter.parse(dateInString.replaceAll("Z$", "+0000")); 
    System.out.println(date); 

} catch (ParseException e) { 
    e.printStackTrace(); 
} 

Его выход будет Sun Oct 05 20:53:01 IST 2014

Однако я не уверен, почему нам пришлось заменить «Все», если вы не добавите replaceAll, программа завершится с ошибкой.

4

Т.Л., д-р

LocalDateTime.parse( // Parse string as value without time zone. 
    "2017-01-23 12:34 PM" , 
    DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a") 
).atZone(ZoneId.of("America/Montreal")) // Assign time zone. 
.toString()    // Generate string: 2017-01-23T17:34:00Z 
.replace("T" , " ") // Substitute SPACE for 'T' in middle. 
.replace("Z" , " Z") // Insert SPACE before 'Z'. 

Избегайте унаследованное даты и время занятия

других ответы использовать проблемные старые классы даты и время (Date, Calendar и т.д.), теперь наследство, вытесняется java.time.

LocalDateTime

У меня есть строка в шаблоне YYYY-MM-ДД ЧЧ: ММ Такой входной строкой

испытывает недостаток каких-либо признаков офсетной из-UTC или часового пояса. Поэтому мы анализируем как LocalDateTime.

Определите шаблон форматирования, соответствующий вашему вводу с объектом DateTimeFormatter.

String input = "2017-01-23 12:34 PM" ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a"); 
LocalDateTime ldt = LocalDateTime.parse(input , f); 

ldt.toString(): 2017-01-23T12: 34

Обратите внимание, что LocalDateTime является не конкретный момент, лишь смутное представление о диапазоне возможных моментов , Например, через несколько минут после полуночи в Париже Франция все еще «вчера» в Монреале, Канада. Таким образом, без контекста часового пояса, такого как Europe/Paris или America/Montreal, просто сказать «через несколько минут после полуночи» не имеет смысла.

ZoneId

и я могу получить объект времени зоны отдельно, в которой выше строка представляет собой дату.

Часовой пояс представлен классом ZoneId.

Указать proper time zone name в формате continent/region, такие как America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте аббревиатуру 3-4 буквы, такую ​​как EST или IST, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).

ZoneId z = ZoneId.of("America/Montreal"); 

ZonedDateTime

Нанести ZoneId получить ZonedDateTime, который действительно является точка на временной шкале, в определенный момент в истории.

ZonedDateTime zdt = ldt.atZone(z); 

zdt.toString(): 2017-01-23T12: 34-05: 00 [Америка/Монреаль]

Instant

Я хочу, чтобы преобразовать это ниже формат. YYYY-MM-дд чч: мм: сс Z

Во-первых, известно, что Z буквенный символ является аббревиатурой Zulu и средства UTC. Другими словами, offset-from-UTC с нулевыми часами, +00:00.

Instant класса представляет момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Вы можете извлечь объект Instant из ZonedDateTime.

Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC. 

Для генерации строки в стандартном формате ISO 8601, такие как 2017-01-22T18:21:13.354Z, вызовите toString. Стандартный формат не имеет пробелов, использует T для разделения даты года-месяца с минуты-минуты и добавляет Z канонически для смещения нуля.

String output = instant.toString(); 

instant.toString(): 2017-01-23T17: 34: 00Z

я настоятельно рекомендуется использовать стандартные форматы когда это возможно. Если вы настаиваете на использовании пробелов, как в указанном желаемом формате, либо определите свой собственный шаблон форматирования в объекте DateTimeFormatter, либо просто выполните строчную манипуляцию на выходе Instant::toString.

String output = instant.toString() 
         .replace("T" , " ") // Substitute SPACE for T. 
         .replace("Z" , " Z"); // Insert SPACE before Z. 

выход: 2017-01-23 17:34:00 Z

Попробуйте code live at IdeOne.com.


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.

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