2010-02-02 4 views
2

Im ayant un problème avec java date, quand je passe une date avant 1949 dans la méthode ci-dessous. La date à laquelle je suis retourné est par exemple 2049, je suis conscient qu'il a quelque chose à voir avec le format de la date et je pense que l'utilisation de yyyy au lieu de RRRR l'aurait corrigé. Mais je ne comprends pas pourquoi ou comment l'enlever. Toute aide sera beaucoup apréciéJava Date numéros

public static java.sql.Date parseDate(String date) throws ParseException { 
    if (date != null) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); 
    return new java.sql.Date(dateFormat.parse(date).getTime()); 
    } 
    return null; 
} 

Merci Jon

+3

A quoi ressemble la 'date de la chaîne'? Commentaires: 1) Vous devriez utiliser 'java.util.Date' au lieu de' java.sql.Date'. 2) Vous devriez utiliser Joda Time au lieu de 'java.util.Date'. – BalusC

+4

"J'ai un problème avec java date" - C'est bon, tout le monde a –

Répondre

2

laissez-moi format pour vous ..

public static java.sql.Date parseDate(String date) throws ParseException { 
    if (date != null) { 
     SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); 
     return new java.sql.Date(dateFormat.parse(date).getTime()); 
    } 
    return null; 
} 

Ce que je pense est ce que vous voulez ...

private Date convertDate() throws ParseException 
{ 
    String dateStr = "21-02-2010"; 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
    Date date = null; 
    if (dateStr != null) 
    { 
     date = new Date(dateFormat.parse(dateStr).getTime()); 
    } 

    System.out.println(date); 
    return date; 
} 

Pour 21-02-2010 vous obtiendrez ... Dim Fév 21 00:00:00 GMT 2010

Pour 21-02-1938, vous obtiendrez ... Lun 21 février 00:00:00 GMT 1938

Est-ce que l'aide? Je pourrais être dû à vous avoir MMM dans votre code.

0

tl; dr

java.sql.Date.valueOf( 
    LocalDate.parse("12-Jan-23" , DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US)) 
) 

Time Zone

Votre code ne tient pas compte de la question cruciale du fuseau horaire. La détermination d'une date nécessite un fuseau horaire. Pour un moment donné, la date varie autour du globe par zone. Le code utilise Date qui est toujours en UTC. Donc, votre valeur de date produite à partir de la classe Date mal nommée sera précise pour UTC mais pas valable pour d'autres fuseaux horaires tels que America/Montreal ou Asia/Kolkata.

En utilisant java.time

La façon moderne de faire ce travail est avec les classes de java.time qui supplantent les classes date temps anciens vieux gênants.

La classe LocalDate représente une valeur de date uniquement sans heure et sans fuseau horaire.

Pour analyser une chaîne entrante, définissez un formatage avec DateTimeFormatter. Indiquez un Locale pour le langage humain à utiliser lors de la traduction du nom du mois.

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US); 
LocalDate localDate = LocalDate.parse("12-Jan-2017" , f); 

Avec JDBC 4.2 et versions ultérieures, vous pouvez passer le LocalDate directement à votre base de données avec setObject et getObject méthodes.

Pour un pilote JDBC non encore mis à jour, revenez aux types java.sql.

java.sql.Date sqlDate = java.sql.Date.valueOf(localDate); 
LocalDate localDate = sqlDate.toLocalDate(); 

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 en maintenance mode, conseille la migration vers les classes 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 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.