2015-12-25 30 views
6

Jeśli wejście to 01-01-2015, powinno ono zostać zmienione na 2015-01-01.
Jeśli wartość wejściowa to 2015-01-01, powinna zmienić się na 01-01-2015.
użyłem SimpleDateFormat ale nie uzyskać poprawny wynik:Zmiana formatu daty

//Class to change date dd-MM-yyyy to yyyy-MM-dd and vice versa 
public class ChangeDate { 
    static SimpleDateFormat formatY = new SimpleDateFormat("yyyy-MM-dd"); 
    static SimpleDateFormat formatD = new SimpleDateFormat("dd-MM-yyyy"); 

    //This function change dd-MM-yyyy to yyyy-MM-dd 
    public static String changeDtoY(String date) { 
    try { 
     return formatY.format(formatD.parse(date)); 
    } 
    catch(Exception e) { 
     return null; 
    } 
    } 

    //This function change yyyy-MM-dd to dd-MM-yyyy 
    public static String changeYtoD(String date) { 
    try { 
     return formatD.format(formatY.parse(date)); 
    } 
    catch(Exception e) { 
     return null; 
    } 
    } 
} 

chcę jakiś warunek, który automatycznie wykrywa wzór datę i zmiany do innego formatu.

+0

Pozycja pierwszego łącznika może? – Henry

+1

uzyskać wystąpienie pierwszego łącznika zgodnie z tym, wybierając funkcję – Sreemat

Odpowiedz

2

regex Overkill

Do pracy daty i czasu, nie trzeba męczyć się z regex.

Po prostu spróbuj przeanalizować jeden format, zalewki dla oczekiwanego wyjątku. Jeśli wyjątek zostanie faktycznie zgłoszony, spróbuj przeprowadzić analizę w innym formacie. Jeśli zostanie zgłoszony wyjątek, wiesz, że dane wejściowe są nieoczekiwanie w żadnym z formatów.

java.time

Używasz starych klas kłopotliwe Date-Time teraz zastąpione przez java.time ramach wbudowany w Java 8 i późniejszych. Nowe klasy zostały zainspirowane cieszącym się dużym powodzeniem frameworkem Joda-Time, który ma być jego następcą, podobnym do koncepcji, ale zmienionym na nowo. Zdefiniowany przez JSR 310. Rozszerzony o projekt ThreeTen-Extra. Zobacz Oracle Tutorial.

LocalDate

Nowe zajęcia obejmują jeden, LocalDate dla data-tylko bez wartości Time-of-day. Tylko to, czego potrzebujesz.

formatujących

Twój może być pierwszy Format standardowy format ISO 8601, yyyy-MM-DD. Ten format jest domyślnie używany w java.time.

Jeśli ta pierwsza próba zapisu nie powiedzie się, ponieważ dane wejściowe nie pasują do formatu ISO 8601, zostanie zgłoszony DateTimeParseException.

LocalDate localDate = null; 
try { 
    localDate = LocalDate.parse(input); // ISO 8601 formatter used implicitly. 
} catch (DateTimeParseException e) { 
    // Exception means the input is not in ISO 8601 format. 
} 

Inny format musi być określony przez zakodowanym wzór podobny do tego, co robisz z SimpleDateFormat. Więc jeśli wychwycimy wyjątek od pierwszej próby, wykonaj drugą próbę parse.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate localDate = null; 
try { 
    localDate = LocalDate.parse(input); 
} catch (DateTimeParseException e) { 
    // Exception means the input is not in ISO 8601 format. 
    // Try the other expected format. 
    try { 
     localDate = LocalDate.parse(input , formatter); 
    } catch (DateTimeParseException e) { 
     // FIXME: Unexpected input fit neither of our expected patterns. 
    } 
} 
+1

Używanie wyjątków do obsługi nietypowych zachowań (/ do kontroli przepływu) jest bardzo złą praktyką. -1. – XenoRo

+1

Obsługa wyjątków jest wymagana, ponieważ podstawowa metoda Java zwróciła wyjątek. Jeśli próba/catch zostanie pominięta, kod nie zostanie pomyślnie skompilowany. Ten przykład jest wychwytywaniem określonego wyjątku DateTimeParseException generowanego przez metodę parsowania zamiast zwykłego wyjątku lub Throwable, więc ten przykład pokazuje zwięzły i poprawny kod. –

+0

@JasonPlurad Hm, 'DateTimeParseException' jest' RuntimeException', więc kompilator nie wymaga jawnej obsługi wyjątku (throws lub catch). Czy mówisz o czymś innym? W każdym razie 'LocalDate.parse (...)' skompiluje się bez kodu try-catch. Jeśli to rozwiązanie jest eleganckie, to jednak kolejne pytanie. –

0

Poczytaj o Pattern, Matcher i wyrażeń regularnych.

kod Java (w oparciu o OP):

if (date.matches("\\d{2}-\\d{2}-\\d{4}")){ 
    //convert D format to Y format... 
} else if(date.matches("\\d{4}-\\d{2}-\\d{2}")){ 
    //convert Y to D... 
} else { 
    throw new IllegalArgumentException("Received date format is not recognized."); 
} 

Uwaga: Ten mecz matrycowy można poprawić capture groups.
Ex: "\\d{4}(-\\d{2}){2}" lub "(-?\\d{2}){2}\\d{4}"

+2

Downvoter jest mile widziane, aby podać swoje powody ... – XenoRo

7

Istnieją 2 opcje:

  1. Spróbuj sprawdzić z wyrażenia regularnego czegoś. jak:

    if (dateString.matches("\\d{4}-\\d{2}-\\d{2}")) { 
        ... 
    } 
    
  2. Spróbuj przekonwertować do pierwszego wzoru, jeśli zgłasza wyjątek, spróbuj przekonwertować do innego wzoru (ale to jest zła praktyka, aby to zrobić)

+0

Spróbuję pierwszej opcji Próbowałem drugiej opcji, ale konwertuje i dał niewłaściwą datę.Dziękuję – Sreemat

+0

Korzystanie z wyjątków powinien być ograniczony do faktycznych wyjątków, a nie jako sposób postępowania z zamierzonym zachowaniem. -1. – XenoRo

+0

To nie wyrzuca wyjątku @AlmightyR – Sreemat

-2

Wystarczy porównać pozycję pierwszy znak "-" w ciągu daty.

+1

Zakłada, że ​​czytelnik zna lub rozumie "jak", w którym momencie prawdopodobnie nie będzie pytać/czytać o tę odpowiedź. -1. – XenoRo

+0

Twoje powitanie i dzięki WszechmocnyR –

+0

@SantoshVishwakarma Jak to jest teraz, ta odpowiedź powinna zostać opublikowana jako komentarz. Dodaj więcej wyjaśnień i przykładowy kod, aby stać się pełnoprawną odpowiedzią. –

0

Patrz: https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/datetime/iso/examples/StringConverter.java

Non-ISO Data Conversion https://docs.oracle.com/javase/tutorial/datetime/iso/nonIso.html

Dodanie nowego Chronologia identyfikujący Data ISO albo sposób jest inny kompatybilny (niełamliwego) oznacza, aby wprowadzić dane data i sklep w prawidłowych strukturach (gdzie inne funkcje mogą z łatwością działać na danych). Zobacz: https://docs.oracle.com/javase/8/docs/api/java/time/chrono/Chronology.html

"Metoda regex" może zostać złamana przez błędne dane wejściowe i nie pozostawia żadnych środków, aby zwrócić standardowy błąd w odpowiedzi na to, co zostało wprowadzone (aby uzyskać wszędzie identyczny wynik).

Zobacz odpowiedź udzieloną przez użytkownika "Tardate" w tym wątku: How to sanity check a date in java.

Chcesz uzyskać wejście kuloodporne i przechowywać je w prawidłowo zidentyfikowanych strukturach, aby łatwo manipulować nimi z innymi funkcjami.