2010-01-28 4 views
8

[classe GWT côté client]Time Zones en Java/GWT (-côté client)

J'ai un objet Date ...

Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS") 
         .parse("2009-10-12T00:00:00.000); 

Cela fonctionne très bien. Cependant, quand je fais:

dateObject.getTime(); 

Il retourne un millisecondes de temps UNIX à l'aide d'un GMT avec l'heure d'été, donc en fait un temps UNIX je ne peux pas utiliser. J'en ai besoin en UTC. Comment puis-je faire cela?


Actuellement, je suis une date et l'analyse, il me redonnant:

'Thu Apr 16 08:46:20 GMT+100 2009' @ '1239867980191' 

Cependant la date je passe en 1 heure moins cette fois-ci (et non 07h46 8 : 46!).

Comment puis-je transmettre le fait qu'il s'agit de l'UTC? Ou s'il ne peut pas utiliser l'UTC (ce qui serait ridicule), comment utiliser GMT sans l'heure d'été?

+9

Il n'y a pas de notion de "UNIX Time (in) millisecondes utilisant un GMT avec l'heure d'été". Le nombre de millisecondes écoulées depuis l'époque est fixe et n'est pas lié à l'heure GMT et/ou à l'heure d'été. Vous pouvez soit alimenter une chaîne de temps mal formatée et/ou oublier de préciser si vous utilisez l'heure d'été ou non ou de convertir à tort votre temps en millisecondes dans un autre format. Mais le nombre de millisecondes depuis l'époque (utilisé à la fois par Java et par Unix et par beaucoup d'autres technologies) est totalement indépendant du GMT et de l'heure d'été. – SyntaxT3rr0r

+0

OldEnthusiast: cela devrait être une réponse. –

+0

Eh bien, vous obtenez certainement le prix du Pedant of the Day. – Federer

Répondre

5

Votre dernière modification rend les choses plus claires. Fondamentalement, vous êtes confus, et vous obtenez déjà ce que vous voulez.

1239867980191 millisecondes depuis l'Epoch se traduit au jeudi 16 avril 2009 à 7: 46: 20.191 dans le fuseau horaire GMT. Le même instant se traduit par le même jour, mais 8: 46: 20.191 dans le fuseau horaire GMT + 01. Si votre chaîne d'entrée spécifiait "7: 46: 20.191" et vous avez en effet 1239867980191 de Date.getTime() alors félicitations, le code d'analyse a compris votre "7: 46: 20.191" comme à interpréter dans le fuseau horaire GMT, et l'a fait correctement.

Si ensuite vous obtenez "8:46:20" lors de l'impression, c'est uniquement parce que vous utilisez le fuseau horaire GMT + 01 pour afficher cet instant. Notez que la chaîne contient GMT+100 précisément pour vous informer qu'il utilise ce fuseau horaire à des fins d'affichage. L'instant que l'instance Date représente est néanmoins exactement l'instant que vous souhaitez qu'il contienne. Rappelez-vous qu'une instance Date représente un instant dans le temps, pour lequel aucune notion de fuseau horaire ne s'applique: les fuseaux horaires sont utilisés pour convertir des instants en éléments de calendrier (jours, heures ...) et en arrière.

Pour convertir un Date en une chaîne affichable, utilisez DateTimeFormat.format(Date, TimeZone) qui vous permet de spécifier le fuseau horaire que vous souhaitez utiliser pour cette chaîne.

+0

+1 pour une bonne clarification et pointant vers 'DateTimeFormat.format (Date, TimeZone)' –

+0

Wow, cela a été une situation confuse, il semble que vous avez raison, merci pour la clarté supplémentaire :) – Federer

-2

Essayez l'objet Calendar.

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS") 
        .parse("2009-10-12T00:00:00.000); 
cal.setTime(dataObject); 
cal.getTimeInMillis(); 

Selon l'API, getTimeInMillis() retourne "l'heure actuelle comme millisecondes UTC de l'époque."

EDIT: comme souligné par _bravado, l'API Calendar n'est actuellement pas disponible pour GWT (Issue 603). Bien que cela soit le bon moment dans une application Java, cela ne fonctionnera pas ici. Il y a des informations dans le group sur l'utilisation de GMT.

EDIT: Manquer un crochet de fermeture sur le Calendar.getInstance du() appeler

+6

Je ne pense pas que vous pouvez utiliser le calendrier avec GWT? – Federer

+0

Très bon point. – justkt

3

Depuis la classe Calendar est pas pris en charge GWT, peut-être quelque chose comme ceci hackish fonctionnera:

final String timezone = "GMT-07:00"; 
DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ"); 
long unix = dtf.parse("2009-10-12T00:00:00" + timezone).getTime(); 

De cette façon, vous pouvez fournir les informations de fuseau horaire correctes - cependant, cela devrait être le comportement par défaut.

+0

C'est le genre de chose que j'essayais. Cependant, je ne pouvais pas obtenir une bonne combinaison du tout. J'aurais pensé que le code de fuseau horaire serait "UTC" pour UTC? Est-ce que -7: 00 Californie ou quelque chose? – Federer

+0

J'ai ajouté '' "GMT-07: 00" 'à titre d'exemple, vous devriez changer pour quelle valeur travaille pour vous;] (afin que vous obteniez votre" UNIX Time millisecondes en utilisant un GMT avec l'heure d'été ";)) –

1

C'est l'inverse. Une instance Date contient le temps en millisecondes depuis l'époque, en utilisant l'échelle de temps UTC (c'est-à-dire les secondes intercalaires sont ignorées). C'est ce que Date.getTime() revient et c'est ce que vous voulez.

Le coupable est ici l'analyseur, qui interprète la date que vous donnez comme une chaîne dans votre fuseau horaire local. Si vous voulez DateTimeFormat d'interpréter la chaîne comme une date et heure donnée dans le fuseau horaire UTC, ajoutez une zone de temps explicite à la chaîne analysable:

DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ") 
    .parse("2009-10-12T00:00:00.000" + " GMT"); 

(qui précède suppose que je compris la documentation GWT correctement; Je n'ai pas essayé.)

Juste pour être clair dans mes notations: à toutes fins pratiques, il n'y a pas de différence entre "GMT" et "UTC", et il n'y a pas d'heure d'été dans le fuseau horaire GMT.Les autres fuseaux horaires sont souvent définis comme "GMT plus ou moins un décalage" et le décalage peut changer entre l'été et l'hiver. Par exemple, le fuseau horaire à New York est quelque peu équivalent à "GMT-04" en été et "GMT-05" en hiver.

+0

I pense GMT inclut automatiquement l'heure d'été - ce que je ne veux pas. Je veux UTC ordinaire ou GMT normal. – Federer

+0

Corriger cela - c'est le cas. :( – Federer

+0

@_bravado: Ce n'est pas la raison pour laquelle la Grande-Bretagne utilise la BST en été – Powerlord

0

Je continue à voir des formats avec ZZZZ étant suggéré ... mais pourquoi?

"yyyy-MM-jj'T'HH: mm: ss.SSSZ" correspondrait

"2009-10-12T00: 00: 00,000 à 0000"

La dernière partie étant le décalage de l'UTC; La Californie (pour utiliser le temps d'exemple de quelqu'un d'autre) serait -0800, -0700 en été.

En remarque, GMT est également toujours -0000. C'est pourquoi le fuseau horaire d'été de la Grande-Bretagne est BST (British Summer Time, +0100).

+0

Je passe dans un horodatage extrait d'un fichier qui est en UTC. avec vos suggestions - et il est en train de le convertir en GMT Summertime - encore une fois soit vous ne comptez pas GWT Client-Side ou quelque chose est fondamentalement faux avec mon GWT - qui est la dernière version – Federer