2009-07-22 9 views
8

Disons que j'ai une chaîne qui représente une date qui ressemble à ceci:Comment afficher une date avec un fuseau horaire personnalisé?

« Mer 8 juillet 2009 17:08:48 GMT »

Je Parse cette chaîne dans un objet date comme celui-ci:

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy"); 
Date fromDate = (Date)formatter.parse(fromDateString); 

Cela me donne l'objet date correct. Maintenant, je veux afficher cette date en tant que valeur CDT.

J'ai essayé beaucoup de choses, et je n'arrive tout simplement pas à le faire fonctionner correctement. Il doit y avoir une méthode simple utilisant la classe DateFormat pour que cela fonctionne. Aucun conseil? Ma dernière tentative était la suivante:

formatter.setTimeZone(toTimeZone); 
String result = formatter.format(fromDate); 

Répondre

16

Utilisez « zzz » au lieu de « ZZZ »: « Z » est le symbole pour un fuseau horaire RFC822.

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 

Cela dit, mon conseil standard sur des choses date/heure est d'utiliser Joda Time, qui est une API tout à fait mieux.

EDIT: programme court mais complet:

import java.text.*; 
import java.util.*; 

public class Test 
{ 
    public List<String> names; 

    public static void main(String [] args) 
     throws Exception // Just for simplicity! 
    { 
     String fromDateString = "Wed Jul 08 17:08:48 GMT 2009"; 
     DateFormat formatter = new SimpleDateFormat 
      ("EEE MMM dd HH:mm:ss zzz yyyy"); 
     Date fromDate = (Date)formatter.parse(fromDateString); 
     TimeZone central = TimeZone.getTimeZone("America/Chicago"); 
     formatter.setTimeZone(central); 
     System.out.println(formatter.format(fromDate)); 
    } 
} 

Sortie: Mer 08 12:08:48 CDT juil 2009

+0

Malheureusement, je ne peux pas ajouter une autre dépendance sans plus de paperasse que je veux traiter. Il doit y avoir un moyen de formater les fuseaux horaires en utilisant les bibliothèques java standard. –

+0

Il y a, comme indiqué dans la réponse. Attendez-vous à plus de douleur si vous devez manipuler une autre date/heure. –

+0

Ce n'est pas utile. Le formateur crache toujours le temps en GMT et non le CDT reqeusted. –

2

utilisant:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central")); 

sorties:

Wed Jul 08 12:08:48 CDT 2009 

pour la date dans votre exemple le sur ma machine. C'est après avoir substitué zzz pour ZZZ dans la chaîne de format.

2

Désolé pour trouver un ancien fil. Mais je me demandais s'il y a une classe java qui contient tous les identifiants de zones de temps comme une classe constante. Ainsi, au lieu d'avoir à coder en dur le fuseau horaire ID lors de la configuration du fuseau horaire comme celui-ci:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central")); 

nous plutôt faire quelque chose de plus standard/uniforme:

formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL)); 

où SomeConstantClass .java est une classe qui contient les constantes faisant référence aux différents identifiants de fuseau horaire pris en charge par la classe TimeZone.

1

La manière moderne est avec les classes java.time.

ZonedDateTime

Spécifiez un modèle de mise en forme pour correspondre à votre chaîne d'entrée. Les codes sont similaires à SimpleDateFormat mais pas exactement. Assurez-vous de lire le document de classe pour DateTimeFormatter. Notez que nous spécifions un Locale pour déterminer quel langage humain utiliser pour le nom du jour de la semaine et le nom du mois.

String input = "Wed Jul 08 17:08:48 GMT 2009"; 
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH); 
ZonedDateTime zdt = ZonedDateTime.parse (input , f); 

ZDT.toString(): 2009-07-08T17: 08: 48Z [GMT]

Nous pouvons ajuster cela dans n'importe quel autre fuseau horaire.

Spécifiez un proper time zone name au format continent/region. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que CDT ou EST ou IST car ce ne sont pas de vrais fuseaux horaires, non standardisés, et même pas uniques (!).

Je vais deviner que par CDT vous vouliez dire un fuseau horaire comme America/Chicago.

ZoneId z = ZoneId.of("America/Chicago"); 
ZonedDateTime zdtChicago = zdt.withZoneSameInstant(z); 

zdtChicago.toString() 2009-07-08T12: 08: 48-05: 00 [Amérique/Chicago]

Instant

En général, mieux travailler en UTC. Pour cet extrait un Instant. La classe Instant représente un moment sur la ligne temporelle dans UTC avec une résolution de nanoseconds (jusqu'à neuf (9) chiffres d'une fraction décimale).

Cette classe Instant est une classe élémentaire de java.time. Vous pouvez penser à ZonedDateTime comme Instant plus un ZoneId.

Instant instant = zdtChicago.toInstant(); 

instant.toString(): 2009-07-08T17: 08: 48Z


A propos java.time

Le cadre java.time est construit en Java 8 et plus tard. Ces classes remplacent les vieilles classes de date-heure legacy gênantes telles que java.util.Date, .Calendar, & java.text.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