Если у меня есть несколько строк, отформатированных по-разному, нужен ли мне отдельный экземпляр DateFormat для анализа каждой строки?

Я пытаюсь изучить все тонкости методов parse() и format() DateFormat для экзамена SCJP 6. Недавно я попытался написать код для форматирования и анализа дат и обнаружил, что метод разбора работает только в том случае, если строка отформатирована в соответствии с форматом экземпляра DateFormat. Означает ли это, что если бы я использовал этот класс в реальной жизни и читал документ, в котором даты были отформатированы 6 различными способами, мне потребовались бы 6 разных объектов DateFormat для успешного анализа строк в объекты даты?

import java.util.*;
import java.text.*;
import java.io.Console;

class PlayWithDates {
    public static void main(String[] args) {
    String formatted = "";
    Date parsed;
    Date d1 = new Date();
    DateFormat defaultFormat = DateFormat.getDateInstance();
    DateFormat shortFormat = DateFormat.getDateInstance(DateFormat.SHORT);
    formatted = defaultFormat.format(d1);
    System.out.println(formatted);
    formatted = shortFormat.format(d1);
    System.out.println(formatted instanceof String);
    System.out.println(formatted);  

    try {
        parsed = shortFormat.parse(formatted);
        System.out.println(parsed); 
    } catch(ParseException pe) {
        System.out.println(pe);
    }
    try {
        parsed = defaultFormat.parse(formatted);
        System.out.println(parsed); 
    } catch(ParseException pe) {
        System.out.println(pe);
    }
    }
}

Когда я запускаю эту программу, я получаю:

Dec 11, 2013
true
12/11/13
Wed Dec 11 00:00:00 MST 2013
java.text.ParseException: Unparseable date: "12/11/13"

Мне кажется, что было бы очень сложно предсказать, когда String будет разборчива или нет. Должен ли я как-то делать это с экземпляром календаря? Спасибо за любые объяснения. Я немного схожу с ума, готовясь к этому экзамену.


person paniclater    schedule 11.12.2013    source источник
comment
Для каждой по-разному отформатированной строки вам понадобится экземпляр DateFormat для ее поддержки...   -  person MadProgrammer    schedule 12.12.2013
comment
Ой. Итак, если вы анализируете документ Dates, вам нужно предсказать, в каком формате будут даты, а затем создать экземпляр DateFormat для каждого возможного формата и попробовать / поймать, пока вам не удастся проанализировать? Похоже, сдать экзамен будет сложно.   -  person paniclater    schedule 12.12.2013
comment
Что вы можете сделать (и то, что есть у Apache Commons), так это создать список возможных форматов даты и просто перебирать список до тех пор, пока вы не добьетесь успеха... или у вас закончатся форматы. Вы должны помнить, что при значении 12 невозможно узнать, день это, месяц или год...   -  person MadProgrammer    schedule 12.12.2013
comment
Справедливо. Я вижу, что 03.12.12 может быть истолковано как 3 декабря или 12 марта. Как я и ожидал, решить гораздо более сложную проблему, чем я первоначально предполагал.   -  person paniclater    schedule 12.12.2013


Ответы (1)


Поскольку SimpleDateFormat принимает спецификацию формата в конструкторе, вам нужен отдельный экземпляр этого класса для каждого формата.

person AlexR    schedule 11.12.2013
comment
DateFormat имеет конструктор без аргументов, который можно использовать следующим образом: DateFormat df = DateFormat.getInstance() или параметр DateFormat df = DateFormat.getDateInstance() - person paniclater; 12.12.2013