2009-05-19 5 views
72

Je veux convertir String en Date en différents formats.Analyser la chaîne à la date avec un format différent en Java

Par exemple,

que je reçois de l'utilisateur,

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

Je veux convertir cette fromDate comme un objet Date de "yyyy-MM-dd" Format

Comment puis-je faire cela?

+1

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". –

Répondre

152

Jetez un coup d'œ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 format 'Date'? – Rachel

+2

@Rachel: Bien sûr, utilisez 'parse' et ne passez pas à' format'. 'parse' analyse une chaîne en une date. –

+2

Mais 'parse' me donne en' date format' comme 'Fri Jan 06 00:01:00 EST 2012' mais il faut dans le format de la date «2012-01-06' – Rachel

11

Utilisez la classe SimpleDateFormat:

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

Utilisation:

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

Pour plus d'efficacité, vous souhaitez stocker vos formatteurs dans un hashmap. La 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); 
} 
+8

CAVEAT !! L'idée est bonne, mais la mise en œuvre ne l'est pas. Les DateFormats ne doivent pas être stockés statiquement, car ils ne sont pas adaptés aux threads! Si elles sont utilisées à partir de plus d'un thread (et cela est toujours risqué avec la statique). FindBugs contient un détecteur pour cela (que je suis arrivé à contribuer initialement, après avoir été mordu.Voir http://dschneller.blogspot.com/2007/04/calendar-dateformat-and-multi-threading.html :-)) –

+0

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

+1

Tant que la méthode parseDate était la seule méthode accédant à la carte, la synchronisation fonctionnerait. Cependant, comme vous le dites, cela entraînerait un goulot d'étranglement. –

3

Alors que SimpleDateFormat va bien travailler pour vos besoins, en plus, vous pouvez consulter Joda Time, qui est apparemment la base de la bibliothèque Date de refaite à neuf en Java 7. Alors que havre de paix I » Je l'ai beaucoup utilisé, je n'ai entendu que de bonnes choses à ce sujet et si vos dates de manipulation dans vos projets, il serait probablement utile d'examiner.

+0

Joda est bon! Yay! –

7

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

Une façon simple pour formater une date et 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 avec format jj/mm/jj: 21/10/2015

5

tl; dr

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

Détails

Les autres réponses avec java.util.Date, java.sql.Date et SimpleDateFormat sont maintenant dépassées.

LocalDate

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

DateTimeFormatter

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

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 a aucun format, tandis qu'un String le fait. 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 vers la console.

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

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

See in action in IdeOne.com.


A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes de date-heure legacy gênantes telles que java.util.Date, Calendar, & SimpleDateFormat.

Le projet Joda-Time, maintenant dans maintenance mode, conseille la migration vers java.time.

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

Où obtenir les classes java.time?

  • Java SE 8 et SE 9 et plus tard
    • 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 SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android
    • Le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus) pour les applications en particulier.
    • Voir How to use….

Le projet ThreeTen-Extra java.time étend avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez trouver ici des classes utiles telles que Interval, YearWeek, YearQuarter et more.

Questions connexes