Konwertuj java.util.Date na String


407

Chcę przekonwertować java.util.Dateobiekt na Stringjęzyk Java.

Format to 2010-05-30 22:15:52



@harschware FYI, projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time . Zobacz samouczek Oracle .
Basil Bourque

1
Nie polecam Datew 2019 roku. Ta klasa jest źle zaprojektowana i długo przestarzała. Zamiast tego użyj Instantlub innej klasy z java.time, nowoczesnego interfejsu API daty i godziny Java .
Ole VV

Odpowiedzi:


757

Konwertuj datę na ciąg znaków, używając DateFormat#formatmetody:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

Od http://www.kodejava.org/examples/86.html


25
dlaczego używać Calendarzamiast zwykłego new Date()? Czy jest jakaś różnica?
Alexander Malakhov,

10
Uwaga: SimpleDateFormat nie jest bezpieczny dla wątków. stackoverflow.com/questions/6840803/…
Zags

23
Kalendarz jest klasą abstrakcyjną, data jest konkretna. Data nie ma pojęcia o strefie czasowej, ustawieniach regionalnych ani żadnej z tych dobrych rzeczy, z których wszyscy nigdy nie korzystamy.
nckbrz

30
MM/dd/yyyyFormat jest głupie i zepsute. Nie używaj tego. Zawsze używaj dd/MM/yyyylub yyyy-MM-dd.
SystemParadox

13
@SystemParadox - To głupie, ale to nie sprawia, że ​​nie ma sensu. Zostałem specjalnie poproszony o użycie go, ponieważ odpowiada on oczekiwaniom ludzi na podstawie raportów. (Wolałbym yyyy-MM-ddwszędzie, ale co możesz zrobić?).
Jesień Leonard

223
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);

63

Commons-lang DateFormatUtils jest pełen gadżetów (jeśli masz wspólny język w swojej ścieżce klas)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

Wymaga dodatkowej nullkontroli.
Farrukh Chishti

23

tl; dr

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

14.11.2014 14:05:09

java.time

Współczesnym sposobem są klasy java.time, które teraz zastępują kłopotliwe, stare, klasowe klasy data-godzina.

Najpierw przekonwertuj java.util.Datena Instant. InstantKlasa reprezentuje moment na osi czasu w UTC o rozdzielczości nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).

Konwersje do / z java.time są wykonywane nowymi metodami dodanymi do starych klas.

Instant instant = myUtilDate.toInstant();

Zarówno twój, jak java.util.Datei java.time.Instantsą w UTC . Jeśli chcesz zobaczyć datę i godzinę jako UTC, niech tak będzie. Wywołanie w toStringcelu wygenerowania ciągu znaków w standardowym formacie ISO 8601 .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

W przypadku innych formatów musisz zmienić Instantje w bardziej elastyczne OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

Zobacz, jak kod działa na żywo na IdeOne.com .

Aby uzyskać ciąg w żądanym formacie, określ DateTimeFormatter. Możesz określić niestandardowy format. Ale użyłbym jednego z predefiniowanych formatów ( ISO_LOCAL_DATE_TIME) i zamieniłem Tjego wynik na SPACJĘ.

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

14.11.2014 14:05:09

Nawiasem mówiąc, nie polecam tego rodzaju formatu, w którym celowo tracisz informacje o przesunięciu względem UTC lub strefie czasowej. Powoduje niejednoznaczność co do znaczenia wartości daty i godziny tego ciągu.

Uważaj również na utratę danych, ponieważ każda ułamkowa sekunda jest ignorowana (skutecznie obcinana) w reprezentacji ciągu znaków wartości daty i godziny.

Aby zobaczyć ten sam moment przez soczewkę zegara ściennego z określonego regionu , zastosuj a, ZoneIdaby uzyskać ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [America / Montreal]

Aby wygenerować sformatowany ciąg, tak samo jak powyżej, ale zastąpić odtz zdt.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

14.11.2014 14:05:09

Wykonując ten kod bardzo wiele razy, możesz być nieco bardziej wydajny i unikać połączeń z String::replace. Porzucenie tego połączenia powoduje również skrócenie kodu. W razie potrzeby określ własny wzorzec formatowania we własnym DateTimeFormatterobiekcie. Buforuj tę instancję jako stałą lub element członkowski do ponownego użycia.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

Zastosuj ten formatyzator, przekazując instancję.

String output = zdt.format( f );

O java.time

Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te wyprzeć kłopotliwe starych klas Date-Time, takich jak java.util.Date, .Calendar, ijava.text.SimpleDateFormat .

Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do java.time.

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień.

Duża część funkcji java.time została przeniesiona z powrotem do Java 6 i 7 w ThreeTen-Backport, a następnie dostosowana do Androida w ThreeTenABP (zobacz Jak korzystać… ).

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time.


Oto przykłady kodowania formatowania za pomocą interfejsu API Java 8 Time: stackoverflow.com/a/43457343/603516
Vadzim

ten kod nie działa OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 Czy jest nowy kod Java 8 o tym samym formacie 2014-11-14T14: 05: 09 + 00: 00? Dziękuję
Bob Bolden

@BobBolden Masz rację, Zjest używany zamiast +00:00domyślnie. Naprawiłem odpowiedź, dzięki. Dla waszej informacji oznacza to to samo: Zwymawiane „Zulu” oznacza przesunięcie zero godzin-minut-sekund, tak samo jak +00:00. ISO 8601 Standard obsługuje oba style.
Basil Bourque

@BasilBourque przepraszam, to nie jest jasne. Mam Java 8 i nie ma w ogóle instant.atOffset (). Czy możesz doradzić, jaki powinien być poprawny kod dla Java 8, aby miał dokładnie ten sam format 2014-11-14T14: 05: 09 + 00: 00 bez instant.atOffset ()? Jestem trochę zagubiony :(
Bob Bolden

@BobBolden Jest rzeczywiście atOffsetmetoda na Instantklasy w Java 8. Patrz Javadoc: Instant::atOffset. W Javie 8 Instant.now().atOffset( ZoneOffset.UTC ).toString()uruchomione zostanie podobne wywołanie . Sprawdź swoje importwyciągi. Sprawdź, czy Twój IDE / projekt jest skonfigurowany do uruchamiania Java 8 lub nowszej, a nie wcześniejszej wersji Java. Zobacz kod uruchamiany na żywo w IdeOne.com: ideone.com/2Vm2O5
Basil Bourque

19

Alternatywne jedno-linijki w zwykłej Javie:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

Używa Formatter i indeksowania względnego zamiast tego nieSimpleDateFormat jest bezpieczne dla wątków , btw.

Nieco bardziej powtarzalne, ale wymaga tylko jednego stwierdzenia. W niektórych przypadkach może to być przydatne.


1
To jest (nie) geniusz. Znacznie lepsza wydajność w ograniczonych środowiskach
Ruslan

9

Dlaczego nie używasz Jody (org.joda.time.DateTime)? Zasadniczo jest to jedna linijka.

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

Proponuję również przekazać DateTimeZone, zamiast przypisywać do obiektu bieżącą domyślną strefę czasową maszyny JVM DateTime. new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque,

7

Wygląda na to, że szukasz SimpleDateFormat .

Format: rrrr-MM-dd kk: mm: ss


Czy „kk” robi coś specjalnego? Myślę, że Eric chce tego za 24 godziny.
Charlie Salts

2
Tak, godzina w ciągu dnia (1-24), ale prawdopodobnie nie tego potrzebuje PO. HH(0–23) jest częstsze.
BalusC

1
@Cahrlie Salts kk idzie z 1-24, gdzie HH z 0-23, i pewnie trochę zarozumiałe było założenie, że chciał 1-24 @BalusC Obiekt DateFormat zarówno parsuje, jak i formatuje.
pickypg 16.04.2011

Nie rozumiem znaczenia twojego ostatniego komentarza. Mój komentarz był do Charliego.
BalusC

Jestem przyzwyczajony do formatów .Net, gdzie HH jest 24-godzinny, a hh to am / pm. Stąd drapanie głowy.
Charlie Salts

5

W jednym ujęciu;)

Aby uzyskać datę

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

Aby uzyskać czas

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

Aby uzyskać datę i godzinę

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

Miłego kodowania :)


1
Do Twojej wiadomości, kłopotliwe stare klasy daty i czasu, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą już starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i Javę 9. Zobacz samouczek Oracle .
Basil Bourque,

4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}

4

Najłatwiejszy sposób użycia to:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

gdzie „rrrr-MM-dd'T'GG: mm: ss” jest formatem daty odczytu

wyjście: nie 14 kwietnia 16:11:48 EEST 2013

Uwagi: HH vs hh - HH odnosi się do formatu godziny 24h - hh odnosi się do formatu godziny 12h


Pytanie dotyczy odwrotnej konwersji.
Vadzim,

4

Jeśli potrzebujesz tylko godziny od daty, możesz po prostu użyć funkcji Ciąg.

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

To automatycznie skróci część czasową ciągu i zapisze go wewnątrz timeString.


Może to spowodować uszkodzenie w różnych lokalizacjach.
Vadzim,

4

Oto przykłady użycia nowego interfejsu API Java 8 Time do sformatowania starszej wersji java.util.Date :

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

Fajnie DateTimeFormatter, że można go skutecznie buforować, ponieważ jest bezpieczny dla wątków (w przeciwieństwie do SimpleDateFormat).

Lista predefiniowanych szablonów i odniesienie do notacji wzoru .

Kredyty:

Jak parsować / formatować daty za pomocą LocalDateTime? (Java 8)

Java8 konwersja java.util.Date na java.time.ZonedDateTime

Sformatuj Instant to String

Jaka jest różnica między ZonedDateTime java 8 a OffsetDateTime?


2

Spróbuj tego,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

Wynik:

2013-05-14 17:07:21

Aby uzyskać więcej informacji na temat formatowania daty i godziny w Javie, zapoznaj się z linkami poniżej

Centrum pomocy Oracle

Przykład daty i godziny w Javie


1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}

1

Spróbujmy tego

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

Lub funkcja użyteczności

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

Z Konwertuj datę na ciąg w Javie


1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String

1
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);

1

Opcja jednej linii

Ta opcja umożliwia łatwe zapisanie rzeczywistej daty w jednym wierszu.

Należy pamiętać, że używa to Calendar.classi SimpleDateFormat, a zatem nie jest logiczne używanie go w Javie8.

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

1
Do Twojej wiadomości, strasznie kłopotliwe klasy daty i czasu, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą teraz spuścizną , wyparte przez klasy java.time wbudowane w Javę 8 i nowsze wersje . Zobacz samouczek Oracle .
Basil Bourque

1
(1) Odpowiedź jest zła (właśnie dostałem 2019-20-23 09:20:22- miesiąc 20?) (2) Nie widzę, że odpowiedź zawiera wszystko, co nie zostało jeszcze uwzględnione w innych odpowiedziach. (3) Proszę, nie uczcie młodych, jak korzystać z dawno przestarzałej i notorycznie kłopotliwej SimpleDateFormatklasy. Przynajmniej nie jako pierwsza opcja. I nie bez zastrzeżeń. Dzisiaj mamy o wiele lepsze java.time, nowoczesne API daty i godziny Java oraz jego DateTimeFormatter.
Ole VV

Tak ... Popełniłem błąd i zapomniałem go poprawić. Dodałem go szybko i nie pamiętałem ... przepraszam !! i dziękuję za komentarze chłopaki
Alejandro Teixeira Muñoz

@ OleV.V. Nie każdy ma dostęp do danych współczesnego Java i interfejsu API czasu ...... więc ... Poprawna jest również ta odpowiedź ...
Alejandro Teixeira Muñoz

1
Dzięki za komentarz. Jeśli chcesz udzielić odpowiedzi dla Java 5 lub dla Java 6 i 7 bez jakiejkolwiek zewnętrznej zależności, bardzo dobrze, to mile widziane, proszę tylko wyraźnie, że to właśnie robisz. A twoja odpowiedź jest nadal błędna, w Nowym Roku będziesz mieć niespodzianki.
Ole VV
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.