2014-02-11 7 views
0

У меня есть строка даты в следующем формате:Java преобразования даты в другой формат

String fieldAsString = "11/26/2011 14:47:31"; 

Я пытаюсь преобразовать его в объект типа Дата в этом формате: «YYYY.MM.DD HH : мм: сс»

Я попытался, используя следующий код:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); 
Date newFormat = sdf.parse(fieldAsString); 

Однако, это бросает исключение, что это дата удается проанализировать.

Так что я пытался что-то вроде этого:

Date date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse(fieldAsString); 
String newFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(date) 

Однако, этот новый формат в настоящее время в формате «String», но я хочу, чтобы моя функция возвращает новую отформатированную дату как «Date» типа объекта , Как мне это сделать?

Спасибо!

+0

У вас есть дата отсюда: 'Дата date = new SimpleDateFormat (" MM/dd/yyyy HH: mm: ss "). Parse (fieldAsString);' –

ответ

6

У вас должно быть впечатление, что объект Date имеет формат. Это не так. Похоже, вам просто нужно это: (. Вы должны рассмотреть указать локаль и, возможно, часовой пояс, заметьте)

Date date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse(fieldAsString); 

Тогда вы получили свою ценность Date. Формат имеет значение только тогда, когда вы позже захотите преобразовать его в текст ... это, когда вы должны указать формат. Важно отделить представляемое значение (мгновенное время, в данном случае) от потенциального текстового представления. Это как целые числа - нет нет разницы между этими двумя значениями:

int x = 0x10; 
int y = 16; 

Они же значением, как раз по-разному представлены в исходном коде.

Дополнительно рассмотрите возможность использования Joda Time для всей вашей работы с датой/временем - это намного более чистый API, чем java.util.*.

+0

Повторите предложение в круглых скобках - я соглашаюсь с указанием времени зоны, определенно. Но указав язык - зачем вам это делать? Если формат «MM/dd/yyyy HH: mm: ss», то в нем нет ничего зависящего от языка. –

+0

@DavidWallace: система календаря зависит от локали. Я подозреваю, что OP всегда хочет использовать григорианский календарь. (Я бы * ожидал * разделители даты и времени также зависят от языка, но, видимо, они не в SimpleDateFormat.) –

+0

Вау, правда? Итак, если я задам языку «SimpleDateFormat» для Ирана, он будет работать с персидским календарем? Это классно. Я вижу, что у меня есть эксперименты. :-) –

0

answer by Jon Skeet является правильным и полным.

Внутренний к java.util.Date (и дата-время, указанный ниже), значение даты-времени хранится как миллисекунды с Unix epoch. Внутри нет струны! Когда вам нужно текстовое представление даты-времени в формате, читаемом человеком, либо вызовите toString, либо используйте объект formatter для create a String object. Аналогично при разборе входная строка отбрасывается, а не сохраняется внутри объекта Date (или объект DateTime в Joda-Time).

Joda времени

Для удовольствия, здесь (лучше) способ сделать эту работу с Joda-Time, как было упомянуто г-тарелочкам.

Главное отличие состоит в том, что в то время как java.util.Date класс кажется, чтобы иметь часовой пояс, это не так.Joda-Time DateTime в отличие от этого действительно знает свой часовой пояс.

String input = "11/26/2011 14:47:31"; 

// From text to date-time. 
DateTimeZone timeZone = DateTimeZone.forID("Pacific/Honolulu"); // Time zone intended but unrecorded by the input string. 
DateTimeFormatter formatterInput = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss").withZone(timeZone); 
// No words in the input, so no need for a specific Locale. 
DateTime dateTime = formatterInput.parseDateTime(input); 

// From date-time to text. 
DateTimeFormatter formatterOutput_MontréalEnFrançais = DateTimeFormat.forStyle("FS").withLocale(java.util.Locale.CANADA_FRENCH).withZone(DateTimeZone.forID("America/Montreal")); 
String output = formatterOutput_MontréalEnFrançais.print(dateTime); 

самосвала утешать ...

System.out.println("input: " + input); 
System.out.println("dateTime: " + dateTime); 
System.out.println("dateTime as milliseconds since Unix epoch: " + dateTime.getMillis()); 
System.out.println("dateTime in UTC: " + dateTime.withZone(DateTimeZone.UTC)); 
System.out.println("output: " + output); 

При запуске ...

input: 11/26/2011 14:47:31 
dateTime: 2011-11-26T14:47:31.000-10:00 
dateTime as milliseconds since Unix epoch: 1322354851000 
dateTime in UTC: 2011-11-27T00:47:31.000Z 
output: samedi 26 novembre 2011 19:47 

Поиск StackOverflow для "Joda", чтобы найти много примеров.

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