Convertir java.util.Date en chaîne


407

Je veux convertir un java.util.Date objet Stringen Java.

Le format est 2010-05-30 22:15:52



@harschware FYI, le projet Joda-Time est maintenant en mode maintenance , l'équipe conseillant la migration vers les classes java.time . Voir Tutoriel par Oracle .
Basil Bourque

1
Je vous recommande de ne pas utiliser et Dateen 2019. Cette classe est mal conçue et dépassée depuis longtemps. Utilisez plutôt Instantou une autre classe de java.time, l'API Java moderne de date et d'heure .
Ole VV

Réponses:


757

Convertir une date en chaîne à l' aide de la DateFormat#formatméthode:

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

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


25
pourquoi utiliser Calendarau lieu de plaine new Date()? Y a-t-il une différence?
Alexander Malakhov

10
Attention: SimpleDateFormat n'est pas thread-safe. stackoverflow.com/questions/6840803/…
Zags

23
Le calendrier est une classe abstraite, la date est concrète. Date n'a aucune idée de TimeZone, Locale ou de tout ce que nous n'utilisons jamais.
nckbrz

30
Le MM/dd/yyyyformat est stupide et cassé. Ne l'utilise pas. Utilisez toujours dd/MM/yyyyou yyyy-MM-dd.
SystemParadox

13
@SystemParadox - C'est stupide, mais cela ne le rend pas inutile. On m'a spécifiquement demandé de l'utiliser car il correspond à ce que les gens attendent des rapports. (Je préfère yyyy-MM-ddpartout, mais que pouvez-vous faire?).
Automne Leonard

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

63

Commons-lang DateFormatUtils est plein de goodies (si vous avez commons-lang dans votre chemin de classe)

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

Nécessite une nullvérification supplémentaire .
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.

2014-11-14 14:05:09

java.time

La méthode moderne consiste à utiliser les classes java.time qui supplantent désormais les anciennes classes de date-heure héritées.

Convertissez d'abord votre fichier java.util.Dateen un Instant. La Instantclasse représente un moment sur la timeline en UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).

Les conversions vers / depuis java.time sont effectuées par de nouvelles méthodes ajoutées aux anciennes classes.

Instant instant = myUtilDate.toInstant();

Les deux votre java.util.Dateet java.time.Instantsont en UTC . Si vous voulez voir la date et l'heure en UTC, qu'il en soit ainsi. Appelez toStringpour générer une chaîne au format standard ISO 8601 .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Pour les autres formats, vous devez transformer votre Instanten le plus flexible OffsetDateTime.

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

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

Découvrez ce code en direct sur IdeOne.com .

Pour obtenir une chaîne au format souhaité, spécifiez a DateTimeFormatter. Vous pouvez spécifier un format personnalisé. Mais j'utiliserais l'un des formateurs prédéfinis ( ISO_LOCAL_DATE_TIME) et remplacerais le Tdans sa sortie par un ESPACE.

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

2014-11-14 14:05:09

Soit dit en passant, je ne recommande pas ce type de format où vous perdez volontairement les informations de décalage par rapport à UTC ou de fuseau horaire. Crée une ambiguïté quant à la signification de la valeur date-heure de cette chaîne.

Méfiez-vous également de la perte de données, car toute fraction de seconde est ignorée (effectivement tronquée) dans la représentation de votre chaîne de la valeur date-heure.

Pour voir ce même moment à travers l'objectif de l' heure d'une horloge murale d'une région particulière , appliquez a ZoneIdpour obtenir a ZonedDateTime.

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

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Amérique / Montréal]

Pour générer une chaîne formatée, faites la même chose que ci-dessus mais remplacez odtpar zdt.

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

2014-11-14 14:05:09

Si vous exécutez ce code un très grand nombre de fois, vous voudrez peut-être être un peu plus efficace et éviter l'appel à String::replace. La suppression de cet appel raccourcit également votre code. Si vous le souhaitez, spécifiez votre propre modèle de mise en forme dans votre propre DateTimeFormatterobjet. Mettez cette instance en cache en tant que constante ou membre pour la réutiliser.

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

Appliquez ce formateur en passant l'instance.

String output = zdt.format( f );

À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les classes date de temps anciens gênants tels que java.util.Date, .Calendar, et java.text.SimpleDateFormat.

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers java.time.

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications.

Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport et adaptée à Android dans ThreeTenABP (voir Comment utiliser… ).

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time.


Voici des exemples de code de formatage avec Java 8 Time API: stackoverflow.com/a/43457343/603516
Vadzim

ce code ne fonctionne pas OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 Existe-t-il un nouveau code Java 8 pour avoir le même format 2014-11-14T14: 05: 09 + 00: 00? Je vous remercie
Bob Bolden

@BobBolden Vous avez raison, Zest utilisé à la place de +00:00par défaut. J'ai fixé la réponse, merci. Pour info, cela signifie la même chose:Z prononcé «zoulou» signifie un décalage de zéro heure-minute-seconde, le même que +00:00. La norme ISO 8601 prend en charge les deux styles.
Basil Bourque

@BasilBourque désolé, ce n'est pas clair. J'ai Java 8 et il n'y a aucun instant.atOffset (). Pourriez-vous s'il vous plaît nous conseiller quel devrait être le code correct pour Java 8 pour avoir exactement le même format 2014-11-14T14: 05: 09 + 00: 00 sans instant.atOffset ()? Je suis un peu perdue :(
Bob Bolden

@BobBolden Il existe en effet une atOffsetméthode sur la Instantclasse en Java 8. Voir Javadoc: Instant::atOffset . Dans Java 8, un appel similaire Instant.now().atOffset( ZoneOffset.UTC ).toString()sera exécuté. Vérifiez vos importrelevés. Vérifiez que votre IDE / projet est configuré pour exécuter Java 8 ou une version ultérieure plutôt qu'une version antérieure de Java. Voir le code en direct sur IdeOne.com: ideone.com/2Vm2O5
Basil Bourque

19

One-liners alternatifs en java simple:

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

Cela utilise Formatter et l'indexation relative au lieu de SimpleDateFormatce qui n'est pas thread-safe , btw.

Un peu plus répétitif mais n'a besoin que d'une seule déclaration. Cela peut être pratique dans certains cas.


1
C'est (en) génie. Performances bien meilleures pour les environnements contraints
Ruslan

9

Pourquoi n'utilisez-vous pas Joda (org.joda.time.DateTime)? Il s'agit essentiellement d'un vol simple.

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

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

Je suggère également de passer une DateTimeZone, plutôt que d'attribuer le fuseau horaire par défaut actuel de la JVM à l' DateTimeobjet. new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque

7

Il semble que vous recherchiez SimpleDateFormat .

Format: aaaa-MM-jj kk: mm: ss


Le "kk" fait-il quelque chose de spécial? Je pense qu'Eric le veut dans 24 heures.
Charlie Salts

2
Oui, l'heure du jour (1-24), mais ce n'est probablement pas ce dont le PO a besoin. HH(0-23) est plus courant.
BalusC

1
@Cahrlie Salts kk va de 1-24, où HH va de 0-23, et c'était probablement un peu présomptueux de ma part de supposer qu'il voulait 1-24 @BalusC L'objet DateFormat analyse à la fois et les formats.
pickypg

Je ne comprends pas la pertinence de votre dernier commentaire. Mon commentaire s'adressait à Charlie.
BalusC

Je suis habitué aux formats .Net, où HH est 24 heures et hh est am / pm. D'où le grattage de tête.
Charlie Salts

5

En un seul coup;)

Pour obtenir la date

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

Pour avoir le temps

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

Pour obtenir la date et l'heure

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

Bon codage :)


1
Pour info, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir Tutorial by 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

La façon la plus simple de l'utiliser est la suivante:

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

où "aaaa-MM-jj'T'HH: mm: ss" est le format de la date de lecture

sortie: dim 14 avril 16:11:48 EEST 2013

Remarques: HH vs hh - HH se réfère au format d'heure 24h - hh se réfère au format d'heure 12h


La question concerne la conversion opposée.
Vadzim

4

Si vous avez seulement besoin de l'heure à partir de la date, vous pouvez simplement utiliser la fonctionnalité de String.

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

Cela réduira automatiquement la partie temporelle de la chaîne et l'enregistrera dans le timeString.


Cela peut rompre avec des paramètres régionaux différents.
Vadzim

4

Voici des exemples d'utilisation de la nouvelle API Java 8 Time pour formater l' héritage 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

Il est agréable de DateTimeFormatterpouvoir le mettre en cache efficacement car il est thread-safe (contrairement SimpleDateFormat).

Liste de formateurs prédéfinis et référence de notation de modèle .

Crédits:

Comment analyser / formater des dates avec LocalDateTime? (Java 8)

Conversion de Java8 java.util.Date en java.time.ZonedDateTime

Format instantané en chaîne

Quelle est la différence entre java 8 ZonedDateTime et OffsetDateTime?


2

Essaye ça,

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

Production:

2013-05-14 17:07:21

Pour plus d'informations sur le formatage de la date et de l'heure en java, reportez-vous aux liens ci-dessous

Centre d'aide Oracle

Exemple de date et d'heure en 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

Essayons ça

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

Ou une fonction utilitaire

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

De convertir la date en chaîne en 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

Option d'une ligne

Cette option obtient une ligne simple pour écrire la date réelle.

Veuillez noter que cela utilise Calendar.classet SimpleDateFormat, et il n'est donc pas logique de l'utiliser sous Java8.

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

1
Pour info, les classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel par Oracle .
Basil Bourque

1
(1) La réponse est fausse (je viens de recevoir 2019-20-23 09:20:22- le mois 20 ??) (2) Je ne vois pas que la réponse fournit quelque chose qui n'est pas déjà couvert dans d'autres réponses. (3) Veuillez ne pas enseigner aux jeunes à utiliser la SimpleDateFormatclasse dépassée et notoirement gênante . Du moins pas comme première option. Et non sans aucune réserve. Aujourd'hui, nous avons tellement mieux java.time, l'API moderne de date et d'heure Java, et ses DateTimeFormatter.
Ole VV

Ouais .... J'ai fait une erreur et j'ai oublié de la corriger. Je l'ai ajouté rapidement, et je ne m'en souviens pas .. désolé !! et merci pour vos commentaires les gars
Alejandro Teixeira Muñoz

@ OleV.V. Tout le monde n'a pas accès aux données Java modernes et à l'api de temps ...... donc ... C'est aussi valable cette réponse ...
Alejandro Teixeira Muñoz

1
Merci pour votre commentaire. Si vous souhaitez fournir une réponse pour Java 5, ou pour Java 6 et 7 sans aucune dépendance externe, très bien, c'est bienvenu, veuillez simplement expliquer explicitement que c'est ce que vous faites. Et votre réponse est toujours fausse, vous aurez des surprises autour du Nouvel An.
Ole VV
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.