Converti java.util.Date in String


407

Voglio convertire un java.util.Dateoggetto in un Stringin Java.

Il formato è 2010-05-30 22:15:52



@harschware FYI, il progetto Joda-Time è ora in modalità manutenzione , con il team che consiglia la migrazione alle classi java.time . Vedi Tutorial di Oracle .
Basil Bourque,

1
Ti consiglio di non usare e Datenel 2019. Quella classe è mal progettata e obsoleta da tempo. Utilizzare invece Instanto un'altra classe da java.time, la moderna API di data e ora di Java .
Ole VV,

Risposte:


757

Convertire una data in una stringa utilizzando il DateFormat#formatmetodo:

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);

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


25
perché usare Calendarinvece di semplice new Date()? C'è differenza?
Alexander Malakhov,

10
Attenzione: SimpleDateFormat non è thread-safe. stackoverflow.com/questions/6840803/...
zag

23
Il calendario è una classe astratta, la data è concreta. Date non ha idea di TimeZone, Locale o di quelle cose buone che non tutti usiamo mai.
nckbrz,

30
Il MM/dd/yyyyformato è stupido e rotto. Non usarlo. Usa sempre dd/MM/yyyyo yyyy-MM-dd.
SystemParadox,

13
@SystemParadox - È stupido, ma ciò non lo rende inutile. Mi è stato specificamente chiesto di usarlo perché corrisponde a ciò che le persone si aspettano dai rapporti. (Preferirei yyyy-MM-ddovunque, ma cosa puoi fare?).
Autunno Leonard,

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

63

Commons DateLormatUtils è pieno di chicche (se nel tuo corso di classe hai delle lingue comuni)

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

Richiede un nullcontrollo aggiuntivo .
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

Il modo moderno è con le classi java.time che ora soppiantano le vecchie problematiche classi data-ora.

Per prima cosa converti il ​​tuo java.util.Datein un Instant. La Instantclasse rappresenta un momento sulla linea temporale in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).

Le conversioni da / a java.time vengono eseguite con nuovi metodi aggiunti alle vecchie classi.

Instant instant = myUtilDate.toInstant();

Entrambi sono java.util.Datee java.time.Instantsono in UTC . Se vuoi vedere la data e l'ora come UTC, così sia. Chiama toStringper generare una stringa in formato ISO 8601 standard .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Per altri formati, devi trasformare il tuo Instantin più flessibile OffsetDateTime.

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

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

Vedi quel codice eseguito dal vivo su IdeOne.com .

Per ottenere una stringa nel formato desiderato, specificare a DateTimeFormatter. È possibile specificare un formato personalizzato. Ma userei uno dei formattatori predefiniti ( ISO_LOCAL_DATE_TIME) e sostituirò il Tsuo output con uno SPAZIO.

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

14/11/2014 14:05:09

A proposito, non consiglio questo tipo di formato in cui si perdono intenzionalmente le informazioni offset-UTC o del fuso orario. Crea ambiguità sul significato del valore data-ora di quella stringa.

Fai anche attenzione alla perdita di dati, poiché ogni secondo frazionario viene ignorato (efficacemente troncato) nella rappresentazione della stringa del valore data-ora.

Per vedere quello stesso momento attraverso l'obiettivo del tempo dell'orologio a parete di una particolare regione , applica a ZoneIdper ottenere a ZonedDateTime.

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

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

Per generare una stringa formattata, fai come sopra ma sostituisci odtcon zdt.

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

14/11/2014 14:05:09

Se esegui questo codice un numero molto elevato di volte, potresti voler essere un po 'più efficiente ed evitare la chiamata a String::replace. La caduta di quella chiamata rende anche il tuo codice più breve. Se lo desideri, specifica il tuo modello di formattazione nel tuo DateTimeFormatteroggetto. Cache questa istanza come costante o membro per il riutilizzo.

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

Applica quel formattatore passando l'istanza.

String output = zdt.format( f );

Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le classi data-ora vecchi problematici, come java.util.Date, .Calendar, e java.text.SimpleDateFormat.

Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione a java.time.

Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni.

Gran parte della funzionalità java.time è trasferita su Java 6 e 7 in ThreeTen-Backport e ulteriormente adattata ad Android in ThreeTenABP (vedi Come usare ... ).

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time.


Ecco alcuni esempi di codice di formattazione con Java 8 Time API: stackoverflow.com/a/43457343/603516
Vadzim

questo codice non funziona OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 Esiste un nuovo codice Java 8 per avere lo stesso formato 2014-11-14T14: 05: 09 + 00: 00? Grazie
Bob Bolden

@BobBolden Hai ragione, Zè usato al posto di +00:00default. Ho risolto la risposta, grazie. Cordiali saluti, quelli significano la stessa cosa Z:, pronunciato "Zulu" significa un offset di zero ore-minuti-secondi, lo stesso di +00:00. Lo standard ISO 8601 supporta entrambi gli stili.
Basil Bourque,

@BasilBourque scusa, non è chiaro. Ho Java 8 e non c'è affatto instant.atOffset (). Potresti per favore consigliare quale dovrebbe essere il codice corretto per Java 8 per avere esattamente lo stesso formato 2014-11-14T14: 05: 09 + 00: 00 senza instant.atOffset ()? Mi sono perso un po ':(
Bob Bolden

@BobBolden V'è infatti un atOffsetmetodo su Instantdi classe in Java 8. Vedere Javadoc: Instant::atOffset. In Java 8, Instant.now().atOffset( ZoneOffset.UTC ).toString()verrà eseguita una chiamata come . Controlla le tue importdichiarazioni. Verifica che il tuo IDE / progetto sia impostato per eseguire Java 8 o versioni successive anziché una versione precedente di Java. Guarda il codice in esecuzione su IdeOne.com: ideone.com/2Vm2O5
Basil Bourque

19

Fodere alternative in giava semplice:

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);

Questo utilizza Formatter e l'indicizzazione relativa invece SimpleDateFormatche non è thread-safe , btw.

Leggermente più ripetitivo ma necessita di una sola affermazione. Questo può essere utile in alcuni casi.


1
Questo è (in) genio. Prestazioni molto migliori per ambienti con restrizioni
Ruslan,

9

Perché non usi Joda (org.joda.time.DateTime)? È fondamentalmente un one-liner.

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

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

Suggerisco anche di passare un DateTimeZone, piuttosto che assegnare l'attuale fuso orario predefinito della JVM DateTimeall'oggetto. new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque,

7

Sembra che tu stia cercando SimpleDateFormat .

Formato: aaaa-MM-gg kk: mm: ss


Il "kk" fa qualcosa di speciale? Penso che Eric lo voglia tra 24 ore.
Charlie Salts

2
Sì, l'ora del giorno (1-24), ma probabilmente non è ciò di cui ha bisogno l'OP. HH(0-23) è più comune.
BalusC

1
@Cahrlie Salts kk va dall'1 al 24, dove HH va dallo 0 al 23, e probabilmente è stato un po 'presuntuoso da parte mia supporre che volesse 1-24 @BalusC L'oggetto DateFormat è in grado di analizzare e formattare.
pickypg

Non capisco la pertinenza del tuo ultimo commento. Il mio commento è stato a Charlie.
BalusC

Sono abituato ai formati .Net, dove HH è 24 ore su 24 e hh è am / pm. Da qui i graffi alla testa.
Charlie Salts

5

In colpo singolo;)

Per ottenere la data

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

Per ottenere il tempo

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

Per ottenere la data e l'ora

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

Buona programmazione :)


1
Cordiali saluti, le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di 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

Il modo più semplice per usarlo è il seguente:

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

dove "yyyy-MM-dd'T'HH: mm: ss" è il formato della data di lettura

uscita: dom 14 aprile 16:11:48 EEST 2013

Note: HH vs hh - HH si riferisce al formato orario 24h - hh si riferisce al formato orario 12h


La domanda riguarda la conversione opposta.
Vadzim,

4

Se hai solo bisogno dell'ora dalla data, puoi semplicemente usare la funzione di String.

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

Ciò ridurrà automaticamente la parte temporale della stringa e la salverà all'interno della timeString.


Ciò potrebbe interrompersi con impostazioni internazionali diverse.
Vadzim,

4

Ecco alcuni esempi di utilizzo della nuova API Java 8 Time per formattare l' eredità 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

È bello DateTimeFormatterche possa essere efficientemente memorizzato nella cache in quanto è thread-safe (a differenza di SimpleDateFormat).

Elenco di fomatter predefiniti e riferimento alla notazione del modello .

Crediti:

Come analizzare / formattare le date con LocalDateTime? (Java 8)

Java8 java.util.Date conversione in java.time.ZonedDateTime

Formatta Instant in String

Qual è la differenza tra java 8 ZonedDateTime e OffsetDateTime?


2

Prova questo,

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();
        }
    }
}

Produzione:

2013-05-14 17:07:21

Per ulteriori informazioni sulla formattazione di data e ora in Java, consultare i collegamenti seguenti

Centro assistenza Oracle

Esempio di data e ora in Java


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

Proviamo questo

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();
    }
}

O una funzione di utilità

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;
}

Da Converti data a stringa in Java


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

Opzione a una riga

Questa opzione consente di scrivere in una sola riga la data effettiva.

Si noti che questo sta utilizzando Calendar.classe SimpleDateFormat, quindi non è logico utilizzarlo in Java8.

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

1
Cordiali saluti, le classi data-ora terribilmente fastidiose come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

1
(1) La risposta è sbagliata (ho appena ricevuto 2019-20-23 09:20:22- mese 20 ??) (2) Non riesco a vedere che la risposta fornisce tutto ciò che non è già coperto in altre risposte. (3) Per favore, non insegnare ai giovani a usare la SimpleDateFormatclasse obsoleta e notoriamente problematica . Almeno non come prima opzione. E non senza alcuna prenotazione. Oggi abbiamo molto meglio nella java.timemoderna API di data e ora di Java e nelle sue DateTimeFormatter.
Ole VV,

Sì ... ho fatto un errore e ho dimenticato di correggerlo. L'ho aggiunto rapidamente, e non ricordo ... scusa !! e grazie per i vostri commenti ragazzi
Alejandro Teixeira Muñoz,

@ OleV.V. Non tutti hanno accesso ai dati Java moderni e al tempo api ...... quindi ... È valida anche questa risposta ...
Alejandro Teixeira Muñoz,

1
Grazie per il tuo commento. Se si desidera fornire una risposta per Java 5 o Java 6 e 7 senza alcuna dipendenza esterna, va bene, è il benvenuto, si prega di rendere esplicito che è quello che si sta facendo. E la tua risposta è ancora sbagliata, otterrai sorprese intorno a Capodanno.
Ole VV,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.