2012-03-05 2 views
1

Я пытаюсь разобрать одну строку в формате yyyy-MM-dd и один на yyyy-MM-dd HH:mm:ss. Я использую SimpleDateFormat.Java: SimpleDateFormat - Невозможно разобрать строку до даты нужного формата

Я использовал тот же метод успешно ранее, но теперь что-то идет не так. Я получаю дату в стандартном формате, то есть Tue Mar 05 00:00:00 GMT+05:30 2012 (для yyyy-MM-dd) и Mon Mar 05 13:01:35 GMT+05:30 2012 (для yyyy-MM-dd HH:mm:ss), где мне они должны быть 2012-03-05 и 2012-03-05 13:01:35 соответственно.

Это то, что я делаю:

Date today = new Date(); 
SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
try { 
    today = tsdf.parse(tsdf.format(new Date())); 
} catch(Exception e) { 
    System.out.println("Error occurred"+ e.getMessage()); 
} 

System.out.println(today); 

И

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
try { 
    // I recieve a string in this format here (refers to 5 march 2012). 
    myDate = sdf.parse('2012-03-05');    
    System.out.println(myDate); 
} catch(Exception e) { 
    System.out.println("Error occurred "+ e.getMessage()); 
} 
+1

Какая ошибка вы получаете? Есть ли стек? Или в каком формате вы получаете дату? – TrueDub

+1

'2012-03-05' должно быть "2012-03-05" – radimpe

+0

Просьба показать исключение stacktrace (сгенерировано e.printStackTrace()) –

ответ

2
today = tsdf.parse(tsdf.format(new Date())); 
System.out.println(today); 

кажется мне, как вы ожидаете, что экземпляр Date получает отформатирован. Это не относится к делу. A Date экземпляр представляет дату, которая может быть отформатирована «до» строки. Это класс, который просто содержит значение long (что означает «время в миллисекундах»).

Это даст ожидаемый результат:

Date today = new Date(); 
String formattedDate = tsdf.format(today); 
System.println(formattedDate);  // <- we print the string!! 
+0

Вы правы, я думал, что объект даты отформатирован. На самом деле мне не нужно печатать дату, я хочу вставить запись, содержащую эту дату в базу данных. Я получаю сообщение об ошибке. – kanishk

+2

Какая ошибка? Постарайтесь использовать правильный класс: вы можете захотеть 'java.sql.Date' вместо' java.util.Date'. –

3

Вы не выводит строку, которая является результатом форматере, вы выводите реальный объект даты , Это всегда будет результатом Date.toString(), который для JDK, который вы используете, - это формат, который вы видите. Не переверните форматированную строку в объект даты, просто распечатайте ее!

SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
try { 
    String formattedDate = tsdf.format(new Date()); 
} catch(Exception e) { 
    System.out.println("Error occurred"+ e.getMessage()); 
} 

System.out.println(formattedDate); 

Вы не можете применить «формат» на java.util.Date объекта для последующего использования. Это всего лишь сырое количество миллисекунд, и метод toString всегда будет печатать одно и то же представление. Вы должны преобразовать его в форматированную строку и использовать эту строку.

+0

Вы правы Affe! – kanishk

+0

Нужно ли попробовать try-catch tsdf.format (new Date())? Я понимаю, что try-catch необходим для tsdf.parse (String date), но я не уверен, что нам это нужно для tsdf.format (Дата). – George

0

Если вы хотите отформатировать Date экземпляр, вы не должны, используя parse метод, вы должны использовать format метод следующим образом:

Date today = new Date(); 
    SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd"); 
    try 
    { 
     System.out.println(tsdf.format(today)); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Error occurred" + e.getMessage()); 
    } 

parse метод используется для преобразования строки на дату и format метод для форматирования a Date экземпляр для строки по указанному формату.

0

java.time

Вы используете старые классы хлопотно даты и время в настоящее время вытеснены классами java.time.

Рамка java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют старые неприятные классы времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat. Команда Joda-Time также рекомендует перейти на java.time.

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

Большая часть функциональности java.time портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP.

LocalDate

Для дат только значений, используйте LocalDate класс. Ваше входное значение соответствует стандарту ISO 8601. Форматы ISO 8601 по умолчанию используются в классах java.time для синтаксического анализа и генерации строк, которые представляют значения даты и времени. Поэтому нет необходимости указывать шаблон форматирования.

LocalDate localDate = LocalDate.parse("2012-03-05"); 

Чтобы создать такую ​​строку, позвоните по номеру toString.

String output = localDate.toString(); 

LocalDateTime

Для строки, такие как 2012-03-05 12:34:56 у нас есть проблемы. Не отображается смещение-от-UTC или часовой пояс. Таким образом, это не представляет собой фактический момент на временной шкале, а скорее приблизительное представление о возможных моментах. Этот немомент представлен в java.time классом LocalDateTime.

Формат вашей строки является вариантом ISO 8601, в то время как каноническая версия имеет T в середине, а не в пространстве. Таким образом, одним из вариантов является замена SPACE на T.

LocalDateTime ldt = LocalDateTime.parse("2012-03-05 12:34:56".replace(" " , "T"); 

Или определить шаблон.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); 
LocalDateTime ldt = LocalDateTime.parse("2012-03-05 12:34:56" , formatter); 

Избегайте использования таких даты и времени форматы, отсутствующие в офсетной или информации часового пояса, если на самом деле они предназначены для представления реальных моментов на временной шкале.

ZonedDateTime

Чтобы дать, что значение значение, чтобы определить фактический момент на временной шкале, необходимо назначить временную зону, для которой предназначен дата-время.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ldt.atZone(zoneId); 

Вызов toString генерирует строку в формате, который расширяет стандартный формат ISO 8601 путем добавления имени временной зоны в квадратных скобках.

String output = zdt.toString(); // Yields: 2012-03-05T12:34:56-04:00[America/Montreal] 

Если вы хотите, чтобы опустить T можно заменить с помощью ПРОСТРАНСТВЕ String::replace метода. Или используйте форматтер. Если вы действительно хотите строку, как видно из вопроса, не имеющего никакой информации о смете или часовом поясе (по моей рекомендации), используйте тот же форматтер, что и выше.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); // Not recommended as it lacks offset/zone info. 
String output = zdt.format(formatter); // Yields: 2012-03-05 12:34:56