2008-09-04 6 views
5

Mam ciąg znaków, który zawiera reprezentację daty. Wygląda to tak:W jaki sposób programowo utworzysz wzór od daty zapisanej w ciągu?

Czw 30 listopada 19:00:00 EST 2006

Próbuję utworzyć obiekt Date przy użyciu SimpleDateFormat i mam 2 problemy.

1.) Nie mogę dowiedzieć się wzór na twardym kodu roztwór do konstruktora SimpleDateFormat

2.) Nie mogę znaleźć sposób mogę analizować ciąg przy użyciu API w celu określenia wzoru więc mógłbym ponownie użyć tego dla różnych wzorów danych wyjściowych

Jeśli ktokolwiek zna rozwiązanie za pomocą API lub niestandardowego rozwiązania, bardzo bym to docenił.

+0

FYI, kłopotliwe old zajęcia daty i czasu, takich jak [ 'java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) i' java.text.SimpleTextFormat' są teraz [dziedzictwo ] (https://en.wikipedia.org/wiki/Legacy_system), wypierane przez [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package- summary.html) klas. Zobacz [Tutorial by Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Odpowiedz

2

nie jestem pewien, że istnieje jakiś prosty sposób do analizowania datę i wypracować swój wzór, ale myślałem, że na wzór tej, którą pisał byłoby:

EEE MMM DD hh: mm: ss zzz yyyy

+0

Dzięki! Ten wzór działa, najlepsze, co udało mi się znaleźć za pomocą Google'a, to "ddd MMM dd hh: mm: ss" EST "rrrr", który wyrzucał wyjątek ParseException. Mamy nadzieję, że istnieje również sposób programowego określenia wzoru. – Aaron

0

Po prostu pytasz o wzorzec dla tej daty? Jeśli tak, myślę, że to powinno wystarczyć:

"EEE MMM d HH:mm:ss z yyyy" 

Albo próbujesz podjąć każdą sformatowaną datę i wywnioskować format i analizować je?

1

Jak mówili inni, wzór wygląda tak jak powinno być

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy" 

Co do parsowania dowolny format daty, nie jestem świadomy każdej biblioteki, która robi to w Javie. Jeśli chciałbyś coś takiego rozwinąć, zacznę od spojrzenia na funkcję perl str2time.

2

Jeśli chcesz zrobić coś innego niż analizowania lub formatowanie daty nie ma wiele tam do obsługi same wzory. Jakiś czas temu pisałem komponent Swing do wprowadzania dat do sformatowanego pola tekstowego. Dostarczyłeś wzorzec i przesunął on kursor wprowadzania tekstu przez elementy tego wzorca, dopuszczając tylko prawidłowe wartości.

Jako część tego napisałem DateFormatParser available here as part of the OpenHarmonise open source project.

Parsowanie daty na wzór byłoby niezwykle interesującym problemem. Będziesz musiał przyjąć pewne założenia (np. Użycie: nie w terminie), ale będziesz musiał stawić czoła wiecznym problemom związanym z dwucyfrowymi ustawieniami lat i dnia/miesiąca lub miesiąca/dnia.

0

To naprawdę nie jest to samo, ale możesz chcieć spojrzeć na coś takiego, jak JChronic, które może wykonywać przetwarzanie języka naturalnego na datach. Tak więc datą wejścia może być coś takiego jak "jutro" lub "dwa tygodnie od następnego wtorek".

To może nie pomóc w ogóle dla twojej aplikacji, ale z drugiej strony może.

1

Muszę powiedzieć, że inne pytanie jest bardzo interesujące. Jest jednak jeden poważny problem - przeanalizuj to: 08/07/06! Jeśli ograniczysz się do podzbioru oczekiwanych formatów, prawdopodobnie rozwiążesz problem, bawiąc się z wyrażeń regularnych, możesz zbudować grono oczekiwanych wzorów, a następnie zepsuć ciągi na spacje lub cokolwiek i dopasować części po części.

+0

Zgadzam się, że są zdecydowanie niejasności - jest to najczęstszy problem z datami. Jednak jednym z rozwiązań może być przekazanie metody programowej domyślnego wzorca, jak mm-dd-yy, aby zakładał, że w przypadku napotkania niejednoznacznej daty.Podanie wartości domyślnej (null) dla tego parametru może spowodować niepowodzenie przez wyrzucenie wyjątku, itp. To nie jest idealne rozwiązanie, ale rozsądnie byłoby użyć go w większości sytuacji. – Aaron

2

Warto wiedzieć, że podany format daty nie jest arbitralny. Jest to wynik wbudowanej metody Date.toString() (przynajmniej w lokalizacjach w Wielkiej Brytanii i USA). Nieprzypadkowo jest to również format polecenia unix "date" (przynajmniej na linuksie i wierzę w inne implementacje) - chociaż jest to pedantyczne, Date.toString() wstawia liczby jednocyfrowe z zerową wartością Data uniksowa nie.

Oznacza to, że prawdopodobnie otrzymasz ten format wejściowy, gdy wypiszesz niesformatowaną datę w polu modyfikowalnym przez użytkownika (np. Polu HTML INPUT) i odbierzesz je niezmienione. Dlatego, że dane wejściowe przychodzą w tym formacie, nie oznacza to, że użytkownicy będą wpisywać tysiące innych dowolnych formatów.

Oczywiście nadal mogą. Sposób, w jaki traktuję dane wejściowe na ogół, jest związany z kilkoma blokami try/catch, w których wypróbowuję je w odniesieniu do jednego formatu, a następnie innego, a następnie innego. Nasza standardowa struktura ma domyślnie około 20 różnych formatów. Oczywiście nadal nie jest doskonały; Któregoś dnia znalazłem kogoś, kto wpisał "03 Sept" jako datę (nietypowy skrót miesiąca i bez roku) i nie załatwiliśmy tego scenariusza.

2

Zobacz Apache Commons 'DateUtils. Istnieje metoda parseDate, która pobiera String i wiele wzorców w celu wypróbowania instancji Date.

3

Parser daty POJava org.pojava.datetime.DateTime jest niezmiennym i niezawodnym analizatorem składni obsługującym wiele języków, stref czasowych i formatów.

Najlepszy ze wszystkich, parser jest heurystyczny i nie wymaga wcześniejszego "formatu" do pracy. Wystarczy, że podasz mu ciąg tekstowy daty/godziny i wydasz java.util.Date!

Powiązane problemy