Analyser la chaîne à ce jour avec un format différent en Java


91

Je veux convertir Stringà Datedifférents formats.

Par exemple,

Je reçois de l'utilisateur,

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

Je souhaite le convertir fromDateen objet Date de "yyyy-MM-dd"format

Comment puis-je faire ceci?


2
Un objet Date n'a pas de format, c'est juste un nombre représentant la date. La date peut être représentée par une chaîne au format "aaaa-MM-jj".
user85421

Réponses:


181

Jetez un œil à SimpleDateFormat. Le code ressemble à ceci:

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

1
au lieu d'obtenir le format de chaîne, puis-je obtenir la sortie au Dateformat?
Rachel

4
@Rachel: Bien sûr, utilisez parseet ne continuez pas format. parseanalyse une chaîne à une date.
Michael Myers

3
Mais parseme donne date formatcomme Fri Jan 06 00:01:00 EST 2012mais il en a besoin au 2012-01-06format de date
Rachel

1
@Rachel c'est parce que lorsque vous appelez System.out.println(anyDateObject)la méthode par défaut toString () est appelée qui a été dite imprimer dans ce format, par exemple Fri Jan 06 00:01:00 EST 2012. Vous devez le remplacer pour répondre à vos besoins.
KNU

3
Pour info, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir le didacticiel d'Oracle .
Basil Bourque

13

tl; dr

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

Détails

Les autres réponses avec java.util.Date, java.sql.Dateet SimpleDateFormatsont maintenant dépassées.

LocalDate

La façon moderne de faire date-heure est de travailler avec les classes java.time, en particulier LocalDate. La LocalDateclasse représente une valeur de date uniquement sans heure du jour et sans fuseau horaire.

DateTimeFormatter

Pour analyser ou générer une chaîne représentant une valeur date-heure, utilisez la DateTimeFormatterclasse.

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

Ne confondez pas un objet date-heure avec une chaîne représentant sa valeur. Un objet date-heure n'a pas de format , contrairement à une chaîne. Un objet date-heure, tel que LocalDate, peut générer une chaîne pour représenter sa valeur interne, mais l'objet date-heure et la chaîne sont des objets distincts distincts.

Vous pouvez spécifier n'importe quel format personnalisé pour générer une chaîne. Ou laissez java.time faire le travail de localisation automatique.

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

Dump dans la console.

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

ld: 19/05/2009 | sortie: mardi 19 mai 2009

Voir en action sur IdeOne.com .


À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

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

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*classes.

Où obtenir les classes java.time?

  • Java SE 8 , Java SE 9 et versions ultérieures
    • Intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Versions ultérieures des implémentations de bundle Android des classes java.time.
    • Pour les versions antérieures d'Android (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .


12

Utilisez la SimpleDateFormatclasse:

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

Usage:

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

Pour plus d'efficacité, vous voudrez stocker vos formateurs dans un hashmap. Le hashmap est un membre statique de votre classe 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);
}

9
CAVEAT!! L'idée est bonne, mais la mise en œuvre ne l'est pas. Les DateFormats ne doivent pas être stockés de manière statique, car ils ne sont pas thread-safe! S'ils sont utilisés à partir de plus d'un thread (et c'est toujours risqué avec la statique). FindBugs contient un détecteur pour cela (auquel j'ai contribué au départ, après avoir été mordu. Voir dschneller.blogspot.com/2007/04/… :-))
Daniel Schneller

Votre entrée de blog est une lecture intéressante :-) Et si la méthode parseDate elle-même est synchronisée? Le problème cependant est que cela ralentirait probablement le code ...
Agora

1
Tant que la méthode parseDate était la seule méthode d'accès à la carte, la synchronisation fonctionnerait. Cependant, comme vous le dites, cela créerait un goulot d'étranglement.
Daniel Schneller

8

Convertir une date de chaîne en 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


3

Bien que SimpleDateFormatcela fonctionne en effet pour vos besoins, vous voudrez peut-être également consulter Joda Time , qui est apparemment la base de la bibliothèque de dates refaite en Java 7. Bien que je ne l'utilise pas beaucoup, je n'ai entendu que de bonnes choses à ce sujet et si vous manipulez des dates en profondeur dans vos projets, cela vaudrait probablement la peine d'être examiné.


1

Un moyen simple de formater une date et de la convertir en chaîne

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

sortie: Date au format jj / mm / jj: 21/10/2015


1

Un Dateobjet n'a pas de format , c'est une représentation. La date peut être présentée par un Stringavec le format que vous aimez .

Par exemple, " yyyy-MM-dd", " yy-MMM-dd", " dd-MMM-yy" et etc.

Pour y parvenir, vous pouvez utiliser le SimpleDateFormat

Essaye ça,

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

Ce produit: 2009-05-19


1

Supposons que vous ayez une chaîne comme celle-ci:

String mDate="2019-09-17T10:56:07.827088"

Maintenant, nous voulons changer ce Stringformat de date et d'heure séparés dans Java et Kotlin .

JAVA:

nous avons une méthode pour la date d' extrait :

public String getDate() {
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mDate);
        dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return est-ce: 17/09/2019

Et nous avons une méthode pour le temps d' extraction :

public String getTime() {

    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mCreatedAt);
        dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Returnest-ce: 10:56 AM

KOTLIN:

nous avons une fonction pour la date d' extrait :

fun getDate(): String? {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val date = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
    return dateFormat.format(date!!)
}

Return est-ce: 17/09/2019

Et nous avons une méthode pour le temps d' extraction :

fun getTime(): String {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val time = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("h:mm a", Locale.US)
    return dateFormat.format(time!!)
}

Returnest-ce: 10:56 AM


Veuillez ne pas apprendre aux jeunes à utiliser la SimpleDateFormatclasse depuis longtemps obsolète et notoirement gênante . Du moins pas comme première option. Et pas sans aucune réserve. Aujourd'hui, nous avons tellement mieux avec java.timel'API de date et d'heure Java moderne, et ses DateTimeFormatter. Aussi SimpleDateFormatne peut pas analyser 6 décimales sur les secondes (microsecondes) correctement.
Ole VV

Lorsque j'exécute votre deuxième extrait, je n'obtiens pas ce 10:56 AMque vous dites que je devrais, mais à la place 11:09 AM(testé sur Oracle jdk-11.0.3).
Ole VV

@ OleV.V. , Si une méthode est obsolète depuis longtemps, elle sera obsolète avec une ligne dessus comme signe, si une méthode ou une classe non obsolète nous pouvons l'utiliser, je ne dis pas que c'est le meilleur moyen, peut-être que nous avons un meilleur moyen, mais de cette façon est simple et compréhensible, si une méthode ou une classe était ancienne, il n'y a aucune raison qu'elle soit gênante et que DateTimeFormatternous ayons besoin de minsdk 26ou plus, ce n'est pas une bonne chose
milad salimi

@ OleV.V. Mais merci pour votre commentaire et à propos de votre deuxième commentaire, je peux dire que je le vérifie plusieurs fois en deux applications et qu'il revient10:56 AM
milad salimi

1
@ OleV.V. , Ok mais j'utilise une bibliothèque quand je n'ai aucun moyen ou que l'API (bibliothèque) soit très très bien meilleure que mon code, car lorsque vous ajoutez une bibliothèque, vous ajoutez des codes à votre projet qui peuvent ne pas être utilisés et c'est une surcharge pour votre projet, c'est ma démarche et votre démarche m'est respectable.
milad salimi
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.