2017-01-26 23 views
1

Я пытаюсь взять ввод от пользователя в формате (dd/mm/yy), сохранить его в том же формате и передать его с помощью getter, setter в другой класс. Я попробовал этот путь:Взять дату от пользователя и сохранить его как дату в java

Это то, что я пробовал:

public static void main(String[] args) 
{ 
    Scanner input = new Scanner(System.in); 
    SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy"); 
    Guest gstObject = new Guest(); 
    try { 
     System.out.println("Enter check-in date (dd/mm/yy):"); 
     String cindate = input.next(); 
     Date date1 = myFormat.parse(cindate); 
     gstObject.setIndate(date1); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
} 

С помощью этого кода я получаю исключение, когда я даю ввод в (27012017 или 27 01 2017 г.):

 
java.text.ParseException: Unparseable date: "27" 
    at java.text.DateFormat.parse(DateFormat.java:366) 
    at edu.lfa.GuestArrayList.main(GuestArrayList.java:49) 

Пожалуйста, укажите, какую ошибку я совершил.

+1

Используйте 'input.nextLine()' вместо 'input.next()'. Кроме того, вы запрашиваете у пользователя другой формат, чем ваш 'SimpleDateFormat' фактически принимает, поэтому следите за этим. – Zircon

+1

Итак, если вы хотите, чтобы они вошли в 'dd/mm/yy', почему вы написали' myFormat = new SimpleDateFormat («dd MM yyyy»); '? –

ответ

0

Here's Javadoc для next(), это то, что он говорит:

Находит и возвращает следующий полный маркер из этого сканера. A вводят полный токен и затем ввод, соответствующий шаблону-разделителю .

По умолчанию разделитель является пространством и, следовательно, он читает только 27. Вам нужно прочитать всю строку, используя nextLine(). После работы следует:

System.out.println("Enter check-in date (dd/mm/yy):"); 
String cindate = input.nextLine(); 
if(null != cindate && cindate.trim().length() > 0){ 
    Date date1 = myFormat.parse(cindate); 
} 

Update Для проверки null или пустой строки, вам нужно обернуть код парсинга в if состояния.

+0

Это мой ввод правильно (27 01 2017)? –

+0

Да, без скобок, это правильно. –

+0

Metha I changed 'String cindate = input.next();' to 'String cindate = input.nextLine();' Теперь я получаю ошибку без ввода даты. Ошибка: 'java.text.ParseException: дата не поддается синтаксическому анализу: "" \t в java.text.DateFormat.parse (DateFormat.java:366) \t в edu.lfa.GuestArrayList.main (GuestArrayList.java:49) ' –

0

Другие ответы на вопросы, как правильно использовать Scanner. Я рассмотрю некоторые другие вопросы.

java.time

Вы используете хлопотно старые классы даты и времени, теперь наследство, вытесняли классами java.time. Избегайте класса java.util.Date как Чума.

Кроме того, вы неправильно используете представление даты только с датой + классом времени.

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

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

DateTimeFormatter f = DateTimeFormatter.parse("dd/mm/uuuu"); 

Parse пользовательский ввод.

LocalDate ld = LocalDate.parse(input , f); 

На вашем бизнес-классе Guest, сделать переменную-член типа LocalDate.

Чтобы сохранить код LocalDate, вы можете сериализовать текст в стандартном формате ISO 8601. Просто позвоните toString.

String output = guest.getLocalDate().toString(); 

2017-01-23


О 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.