Pytanie Przetwórz ciąg do daty z różnym formatem w Javie


Chcę się nawrócić String do Date w różnych formatach.

Na przykład,

Dostaję od użytkownika,

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format

Chcę to zmienić fromDate jako obiekt Date z "yyyy-MM-dd" format

Jak mogę to zrobić?


76
2018-05-19 12:22


pochodzenie


Obiekt Date nie ma formatu, jest to tylko liczba reprezentująca datę. Data może być reprezentowana przez ciąg o formacie "rrrr-MM-dd". - Carlos Heuberger


Odpowiedzi:


Spojrzeć na SimpleDateFormat. Kod wygląda mniej więcej tak:

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

try {

    String reformattedStr = myFormat.format(fromUser.parse(inputString));
} catch (ParseException e) {
    e.printStackTrace();
}

159
2018-05-19 12:31



zamiast pobierania formatu ciągu, mogę uzyskać dane wyjściowe Date format? - Rachel
@Rachel: Oczywiście, po prostu użyj parse i nie idźcie dalej format. parse analizuje ciąg znaków do daty. - Michael Myers♦
Ale parse daje mi date format tak jak Fri Jan 06 00:01:00 EST 2012 ale potrzebuje 2012-01-06 format daty - Rachel
@Rachel to dlatego, że kiedy dzwonisz System.out.println(anyDateObject) domyślnie wywoływana jest metoda toString (), która została wydrukowana w tym formacie, np. Fri Jan 06 00:01:00 EST 2012. Musisz go zastąpić, aby pasował do twoich potrzeb. - KNU
FYI, kłopotliwe stare klasy czasu i daty, takie jak java.util.Date, java.util.Calendar, i java.text.SimpleDateFormat są teraz dziedzictwo, wyparte przez java.time klasy wbudowane w Java 8 i Java 9. Zobacz Seminarium przez Oracle. - Basil Bourque


Użyj SimpleDateFormat klasa:

private Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.parse(date);
}

Stosowanie:

Date date = parseDate("19/05/2009", "dd/MM/yyyy");

Aby uzyskać efektywność, chciałbyś zapisać swoje formatery w mapie mieszającej. Histop jest statycznym członkiem twojej klasy util.

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>();

public static Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = hashFormatters.get(format);

    if (formatter == null)
    {
        formatter = new SimpleDateFormat(format);
        hashFormatters.put(format, formatter);
    }

    return formatter.parse(date);
}

12
2018-05-19 12:31



CAVEAT !! Pomysł jest dobry, ale wdrożenie nie jest. DateFormats nie mogą być przechowywane statycznie, ponieważ nie są bezpieczne dla wątków! Jeśli są używane z więcej niż jednego wątku (i zawsze jest to ryzykowne ze statykami). FindBugs zawiera detektor do tego (który zdarzyło mi się przyczynić początkowo, po tym, jak mnie ugryziono dschneller.blogspot.com/2007/04/... :-)) - Daniel Schneller
Wpis na blogu jest interesującym lekturą :-) Co jeśli zsynchronizuję samą metodę parseDate? Problem polega jednak na tym, że prawdopodobnie spowolniłoby to kod ... - Agora
Dopóki metoda parseDate była jedyną metodą uzyskującą dostęp do mapy, synchronizacja będzie działać. Jednak to - jak mówisz - wprowadzi wąskie gardło. - Daniel Schneller


Sprawdź javadocs dla java.text.SimpleDateFormat Opisuje wszystko, czego potrzebujesz.


7
2018-05-19 12:28





Konwertuj datę ciągu na java.sql.Date

String fromDate = "19/05/2009";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dtt = df.parse(fromDate);
java.sql.Date ds = new java.sql.Date(dtt.getTime());
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010

7
2017-08-21 07:01





tl; dr

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

Detale

Inne odpowiedzi z java.util.Date, java.sql.Date, i SimpleDateFormat są już nieaktualne.

LocalDate

Współczesny sposób na zrobienie daty jest ściśle związany z klasami java.time LocalDate. The LocalDate Klasa reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej.

DateTimeFormatter

Aby przeanalizować lub wygenerować ciąg reprezentujący wartość daty i godziny, należy użyć znaku DateTimeFormatter klasa.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "19/05/2009" , f );

Nie łącz obiektu daty i czasu z łańcuchem reprezentującym jego wartość. Obiekt daty i czasu ma Nie format, podczas gdy String ma. Obiekt daty i godziny, na przykład LocalDate, mogą Generować Ciąg reprezentujący jego wartość wewnętrzną, ale obiekt data-czas i ciąg są odrębnymi odrębnymi obiektami.

Możesz określić dowolny niestandardowy format, aby wygenerować ciąg. Lub pozwól java.time wykonać zadanie automatycznego lokalizowania.

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );

Zrzut do konsoli.

System.out.println( "ld: " + ld + " | output: " + output );

ld: 2009-05-19 | moc: mardi 19 maja 2009 r

Zobacz w akcji w IdeOne.com.


O java.time

The java.time framework jest wbudowany w Javę 8 i później. Te klasy zastępują kłopotliwe stare dziedzictwo klasy czasu i daty, takie jak java.util.Date, Calendar& SimpleDateFormat.

The Joda-Time projekt, teraz w tryb konserwacji, doradza migrację do java.time klasy.

Aby dowiedzieć się więcej, zobacz Tutorial Oracle. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja jest JSR 310.

Możesz wymienić java.time obiekty bezpośrednio z bazą danych. Użyć Sterownik JDBC zgodny z JDBC 4.2 lub później. Nie ma potrzeby ciągi, nie ma potrzeby java.sql.* klasy.

Gdzie można uzyskać klasy java.time?

  • Java SE 8, Java SE 9, i później
    • Wbudowany.
    • Część standardowego interfejsu API języka Java z pakietem implementacji.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 i Java SE 7
    • Duża część funkcji java.time została przeniesiona do wersji Java 6 i 7 w ThreeTen-Backport.
  • Android
    • Późniejsze wersje implementacji wiązek systemu Android klas java.time.
    • Dla wcześniejszego Androida (<26), ThreeTenABP projekt dostosowuje się ThreeTen-Backport (wspomniano powyżej). Widzieć Jak korzystać z ThreeTenABP ....

The ThreeTen-Extra projekt rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka przydatnych klas, takich jak Interval, YearWeek, YearQuarter, i jeszcze.


7
2017-10-26 00:18





Podczas SimpleDateFormat rzeczywiście będzie działać dla twoich potrzeb, a dodatkowo możesz chcieć sprawdzić Czas na Jodę, co jest podobno podstawą biblioteki "Data wydania" na Java 7. Chociaż nie korzystałem z niej dużo, słyszałem o niej tylko dobre rzeczy, a jeśli twoja data manipulowania rozlegle w twoich projektach prawdopodobnie byłaby warta w.


3
2018-05-19 12:45



Joda jest dobra! Yay! - Steve McLeod


Prosty sposób na sformatowanie daty i konwersję na ciąg

    Date date= new Date();

    String dateStr=String.format("%td/%tm/%tY", date,date,date);

    System.out.println("Date with format of dd/mm/dd: "+dateStr);

dane wyjściowe: data w formacie dd / mm / dd: 21/10/2015


1
2017-10-21 05:35





ZA Date obiekt ma bez formatuto jest reprezentacja. Data może być przedstawiona przez String z format, który ci się podoba.

Na przykład. "yyyy-MM-dd","yy-MMM-dd","dd-MMM-yy" itd.

Aby to osiągnąć, możesz uzyskać dostęp do SimpleDateFormat

Spróbuj tego,

        String inputString = "19/05/2009"; // i.e. (dd/MM/yyyy) format

        SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); 
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

        } catch (ParseException e) {
            e.printStackTrace();
        }

Wynik: 2009-05-19


0
2017-07-25 05:05