Question

Disons que j'ai une chaîne qui représente une date qui ressemble à ceci:

"Mer 8 juillet 2009 17:08:48 GMT"

Je parser cette chaîne dans un objet date comme ceci:

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

Cela me donne l'objet de date correcte. Maintenant, je veux afficher cette date comme une valeur CDT.

Je l'ai essayé beaucoup de choses, et je ne peux pas le faire fonctionner correctement. Il doit y avoir une méthode simple en utilisant la classe DateFormat pour obtenir ce travail. Aucun conseil? Ma dernière tentative était la suivante:

formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
Était-ce utile?

La solution

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 à la date / heure des choses est d'utiliser Joda temps , 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 8 juillet 12:08:48 CDT 2009

Autres conseils

Utilisation:

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

sorties:

Wed Jul 08 12:08:48 CDT 2009

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

Désolé pour creuser un vieux fil. Mais je me demandais s'il y a une classe java qui contient tous les fuseaux horaires ids comme une constante de classe. Ainsi, au lieu d'avoir à coder en dur le fuseau horaire ID lors de la configuration du fuseau horaire comme ceci:

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 se rapportant aux différents fuseaux horaires ids qui sont pris en charge par la classe TimeZone.

La façon 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 la classe doc DateTimeFormatter . Notez que nous spécifions un Locale pour déterminer ce que le 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]

On peut régler que dans tout autre fuseau horaire.

dans le format de continent/region. Ne jamais utiliser l'abréviation 3-4 lettres telles que CDT ou EST ou IST car ils ne sont pas vraies zones de temps, non standardisés, et même pas uniques (!).

Je suppose que vous vouliez dire par CDT 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 que l'extrait d'un Instant. La classe Instant représente un moment sur la timeline dans UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).

Cette classe Instant est une classe bloc de construction de base 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 de java.time

Le java.time cadre est construit en Java 8 et versions ultérieures. Ces classes supplantent les href="https://en.wikipedia.org/wiki/Legacy_system" gênants vieux les classes date-heure comme java.util.Date , .Calendar , et java.text.SimpleDateFormat .

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

Pour en savoir plus, consultez le Oracle Tutoriel . Et la recherche Stack Overflow pour de nombreux exemples et explications. Spécification est JSR 310 .

Où obtenir les classes java.time?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top