Convertir une chaîne en object de calendrier en Java

Je suis nouveau sur Java, travaille généralement avec PHP.

J’essaie de convertir cette chaîne:

Lun. 14 mars 16:02:37 GMT 2011

Dans un object de calendrier afin que je puisse facilement tirer l’année et le mois comme ceci:

Ssortingng yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH); 

Serait-ce une mauvaise idée de l’parsingr manuellement? En utilisant une méthode de sous-chaîne?

Tout conseil aiderait merci!

 Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH); cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done 

note: définir les parameters Locale fonction de votre environnement / exigence


Voir également

  • Javadoc

Eh bien, je pense que ce serait une mauvaise idée de reproduire le code qui est déjà présent dans les classes comme SimpleDateFormat .

D’un autre côté, personnellement, je vous suggère d’éviter le Calendar et la Date si vous le pouvez, et d’utiliser plutôt Joda Time comme une API de date et d’heure bien mieux conçue. Par exemple, vous devez savoir que SimpleDateFormat n’est pas compatible avec SimpleDateFormat threads, vous avez donc besoin de localisations de thread, de synchronisation ou d’une nouvelle instance chaque fois que vous l’utilisez. Les parsingurs et les formateurs Joda sont compatibles avec les threads.

Aucun nouveau calendrier ne doit être créé, SimpleDateFormat utilise déjà un calendrier en dessous.

 SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US); Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done Calendar cal = sdf.getCalendar(); 

(Je ne peux pas encore commenter, c’est pourquoi j’ai créé une nouvelle réponse)

tl; dr

 YearMonth.from( ZonedDateTime.parse( "Mon Mar 14 16:02:37 GMT 2011" , DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ) ) ).toSsortingng() 

2011-03

Éviter les anciennes classes date-heure

La manière moderne est d’utiliser les classes java.time. Les anciennes classes de date et heure, telles que Calendar sont avérées mal conçues, déroutantes et gênantes.

Définissez un formateur personnalisé pour correspondre à votre entrée de chaîne.

 Ssortingng input = "Mon Mar 14 16:02:37 GMT 2011"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ); 

ZonedDateTime comme un ZonedDateTime .

 ZonedDateTime zdt = ZonedDateTime.parse( input , f ); 

Vous êtes intéressé par l’année et le mois. Les classes java.time incluent la classe YearMonth à cet effet.

 YearMonth ym = YearMonth.from( zdt ); 

Vous pouvez interroger les numéros d’année et de mois si nécessaire.

 int year = ym.getYear(); int month = ym.getMonthValue(); 

Mais la méthode toSsortingng génère une chaîne au format standard ISO 8601 .

 Ssortingng output = ym.toSsortingng(); 

Mettez tout cela ensemble.

 Ssortingng input = "Mon Mar 14 16:02:37 GMT 2011"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" ); ZonedDateTime zdt = ZonedDateTime.parse( input , f ); YearMonth ym = YearMonth.from( zdt ); int year = ym.getYear(); int month = ym.getMonthValue(); 

Vider la console.

 System.out.println( "input: " + input ); System.out.println( "zdt: " + zdt ); System.out.println( "ym: " + ym ); 

entrée: lun. mars 14 16:02:37 GMT 2011

zdt: 2011-03-14T16: 02: 37Z [GMT]

ym: 2011-03

Code direct

Voir ce code en cours d’exécution sur IdeOne.com .

Conversion

Si vous devez avoir un object Calendar , vous pouvez convertir en un GregorianCalendar utilisant les nouvelles méthodes ajoutées aux anciennes classes.

 GregorianCalendar gc = GregorianCalendar.from( zdt ); 

À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date / heure héritées telles que java.util.Date , Calendar et SimpleDateFormat .

Le projet Joda-Time , maintenant 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. La spécification est JSR 310 .

Où obtenir les classes java.time?

  • Java SE 8 et SE 9 et versions ultérieures
    • Intégré
    • Partie de l’API Java standard avec une implémentation intégrée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité java.time est transférée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus) pour Android en particulier.
    • Voir Comment utiliser… .

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

SimpleDateFormat est génial, notez simplement que HH est différent de hh lorsque vous travaillez avec des heures. HH retournera 24 heures sur 24 et hh retournera 12 heures par heure.

Par exemple, ce qui suit renverra 12 heures:

 SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa"); 

Alors que cela va revenir 24 heures sur 24:

 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 

Oui, ce serait une mauvaise pratique de l’parsingr vous-même. Jetez un oeil à SimpleDateFormat , il transformera la chaîne en une date et vous pouvez définir la date dans une instance de calendrier.

Méthode simple:

 public Calendar ssortingngToCalendar(Ssortingng date, Ssortingng pattern) throws ParseException { Ssortingng DEFAULT_LOCALE_NAME = "pt"; Ssortingng DEFAULT_COUNTRY = "BR"; Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY); SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE); Date d = format.parse(date); Calendar c = getCalendar(); c.setTime(d); return c; } 

Analyser une heure avec le fuseau horaire, Z dans le schéma est pour le fuseau horaire

 Ssortingng aTime = "2017-10-25T11:39:00+09:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()); try { Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(aTime)); Log.i(TAG, "time = " + cal.getTimeInMillis()); } catch (ParseException e) { e.printStackTrace(); } 

Sortie: il retournera l’heure UTC

 1508899140000 

entrer la description de l'image ici

Si nous ne définissons pas le fuseau horaire comme dans le cas de yyyy-MM-dd'T'HH:mm:ss . SimpleDateFormat utilisera le fuseau horaire défini dans Setting