2015-12-09 2 views
2

Очень хорошее утро, у меня есть только один запрос, ниже - программа, которая после исполнения год меняется. Допустим, что дата ввода 03/20/2020, а затем дата выполнения, программа приходит как 03/08/2021, что совершенно неправильно. Поскольку год увеличивается, и полная дата неверна. Пожалуйста, сообщите, как я могу исправить свою программу для достижения той же даты.Получение разного формата даты при конверсии в java

public class DateFormattingTest { 

    private static final SimpleDateFormat outputDate = new SimpleDateFormat(
      "dd/MM/yyyy"); 

    public static void main(String[] args) { 

     System.out.println ("03/20/2020:" + extractDate("03/20/2020")); 


     DateFormattingTest test = new DateFormattingTest(); 
     convertDate(test, "03/20/2020"); 

    } 

    public static Date extractDate(String dateStr) { 

     String [] datePatterns = {"yyyy-MM-dd", "dd-MM-yyyy","MM/dd/yyyy" }; 
     Date date = null; 

     try { 
      date = DateUtils.parseDate(dateStr, datePatterns); 
     } 
     catch (Exception except) { 
       except.printStackTrace(); 
     } 
     return date; 
    } 


    private static void convertDate(DateFormattingTest test, String dateString) { 
     java.util.Date date = test.convertStringToDate(dateString); 
     System.out.println(dateString + " -> " + outputDate.format(date)); 
    } 

    public java.util.Date convertStringToDate(String stringValue) { 
     String[] formatStrings = { "dd/MM/yy", "dd-MM-yy", "dd-MMM-yyyy" }; 

     for (String formatString : formatStrings) { 
      try { 
       java.util.Date date = new SimpleDateFormat(formatString) 
         .parse(stringValue); 
       return date; 
      } catch (ParseException e) { 

      } 
     } 

     return null; 

    } 

} 
+0

Ваш оригинальный 'дата String', кажется, в формате' ММ/дд/yyyy' , который используется 'extractDate', но ваш' convertStringToDate' использует формат 'dd/MM/yyyy'. – MadProgrammer

+0

должен добавить MM/dd/yyyy также в массив –

+0

Это было бы хорошим началом – MadProgrammer

ответ

2

Ваш оригинальный String дата, кажется, в формате MM/dd/yyyy, которые extractDate использования, но ваш convertStringToDate использует формат dd/MM/yyyy.

SimpleDateFormat использует шаблон dd/MM/yyyy для разбора stringValue, который на самом деле в MM/dd/yyyy, потому что форматировщик не может определить, какие значения представляют собой то, что он предполагает и корректирует в течение месяца был 20, но качению года.

Простая проверка на это, чтобы сравнить полученную Date с String путем форматирования Date с оригинальным форматировщиком, к примеру ...

public java.util.Date convertStringToDate(String stringValue) { 
    String[] formatStrings = {"dd/MM/yy", "dd-MM-yy", "dd-MMM-yyyy"}; 

    for (String formatString : formatStrings) { 
     try { 
      DateFormat df = new SimpleDateFormat(formatString); 
      java.util.Date date = df.parse(stringValue); 

      if (df.format(date).equals(stringValue)) { 
       System.out.println(formatString + "; " + stringValue + "; " + date); 
       return date; 
      } 
     } catch (ParseException e) { 

     } 
    } 

    return null; 

} 

Который теперь возвращает null.

Однако, если добавить MM/dd/yyyy к formatStrings (String[] formatStrings = {"dd/MM/yy", "dd-MM-yy", "dd-MMM-yyyy", "MM/dd/yyyy"};) в методе convertStringToDate, он будет возвращать 20/03/2020

+0

Хорошее объяснение, но у меня есть один запрос о том, как SimpeDateFormat ведет себя для разных шаблонов дат, не могли бы вы объяснить его более @MadProgrammer – Simmant

+0

@Simmant В каком отношении? – MadProgrammer

1

java.time

Вы можете оформить в java.time пакет и DateTimeFormatter класс. (Tutorial)

Оригинальные java-утилиты для установки даты и времени имеют ряд недостатков, что делает их подверженными ошибкам программиста.

java.time имеет immutable objects и другие продуманные конструкции. Это новый де-факто стандарт.

Например:

String date_string = "03/20/2020"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 
LocalDate parsedDate = LocalDate.parse(date_string, formatter); 

не молча терпят неудачу. Вместо этого, он бросает исключение:

Exception in thread "main" java.time.format.DateTimeParseException: Text '03/20/2020' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 20 

и отладки, вероятно, пошли гораздо быстрее ...

+0

@BasilBourque Действительная точка. Я построил ответ немного больше. –

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