2016-09-22 10 views
0

У меня есть строка ввода в формате dd/MM/yyyy, мне нужно ее преобразовать в дату dd/MM/yyyy.Не удалось преобразовать строку dd/MM/yyyy в Date dd/MM/yyyy в java

Мой подход:

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
String date = formatter.format(formatter.parse("22/09/2016")); 
Date convertedDate = formatter.parse(date); 

Я ожидал 22/09/2016 как объект даты, однако формат вернулся не был, как и ожидалось. O/P=>Mon Sep 12 00:00:00 IST 2016

Любая идея, в которой я ошибаюсь? Заранее спасибо!

+0

Я думаю, что вы чрезмерны. Проверьте [этот ответ] (http://stackoverflow.com/a/6252782/5292801) – Takarii

+1

Вам следует лучше описать, что не так, с вашей точки зрения. Поскольку 'formatter.parse (« 22/09/2016 »)' уже делает то, что вы хотите 'я ожидал 22/09/2016 как объект даты. – SubOptimal

+0

@Takarii Я не использую библиотеку joda –

ответ

6

Вы, кажется, считаете, что «знает» формат. Это не так. Это не часть его состояния - просто количество миллисекунд с эпохи Unix. (Там нет часового пояса ни один - IST вы видите есть ваш местный часовой пояс, это только часть того, что Date.toString() делает.)

В принципе, Date это просто момент времени - когда вы хотите, чтобы конкретный отформатированный значение, то есть когда вы используете SimpleDateFormat.

(Или лучше использовать java.time.* ...)

Думайте об этом как число - число шестнадцать это один и тот же номер, являются ли вы его в двоичной системе, как 10000, десятичной, как 16 или гекс как 0x10. Значение int не имеет понятия «Я двоичное целое» или «Я - целое шестнадцатеричное» - это только при преобразовании его в строку, которая вам нужна для форматирования. То же самое верно для типов даты и времени.

1
try { 
      SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
      Date d = formatter.parse("22/09/2016"); 
      System.out.println(d.toString()); 
      String e = formatter.format(d); 
      System.out.println(e); 
     } catch (ParseException ex) { 
      Logger.getLogger(Json.class.getName()).log(Level.SEVERE, null, ex); 
     } 
+0

, она все еще возвращает строку, не так ли? Мне нужен объект даты. –

+0

@robot_alien Да, вы можете использовать объект 'd'. Его тип даты –

0

A Date, при печати будет называться метод toString объекта. Затем он выберет любой желаемый формат.

Попробуйте

System.out.println(formatter.format(convertedDate)); 

или - очевидно

System.out.println(date); 
2

Т.Л., д-р

LocalDate.parse("22/09/2016" , DateTimeFormatter.ofPattern("dd/MM/yyyy")) 
     .format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) 

ПРОБЛЕМ
  • Вы приравнивая объекты даты и времени со строками, представляющими значения даты-времени. Объект даты-времени может анализировать строку и может генерировать строку, но объект даты-времени всегда является отдельным и отличным от строки. Строка имеет формат; дата-время объекта не.
  • Вы используете неприятные старые классы времени, которые теперь вытесняются классами java.time.
  • Вы пытаетесь установить значение даты только для объекта с датой (круглый штырь в квадратном отверстии).
  • Вы обманываете плохо разработанный метод toString, который тихо применяет часовой пояс к внутреннему значению, которое не имеет часовой пояс (это UTC).

Обязательно прочтите the correct Answer by Jon Skeet.

java.time

Используя новые классы java.time, в частности LocalDate. Класс LocalDate представляет собой значение даты только без времени и без часового пояса.

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 
LocalDate ld = LocalDate.parse("22/09/2016" , f); 

Сформировать строку, чтобы представить это значение в стандартном формате ISO 8601 по телефону toString.

String output = ld.toString(); // 2016-09-22 

Сгенерируйте строку в требуемом формате, применяя форматирование.

String output = ld.format(f); 

О java.time

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

Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.

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

Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport и дополнительно выполнен с возможностью Android в ThreeTenABP (см How to use…).

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