Conversion de l'horodatage local en horodatage UTC en Java
J'ai un millisecondes depuis le local de l'époque timestamp que je voudrais convertir en millisecondes-depuis-UTC-époque d'horodatage. À partir d'un rapide coup d'œil à travers les docs il ressemble à quelque chose de ce genre:
int offset = TimeZone.getDefault().getRawOffset();
long newTime = oldTime - offset;
Est-il une meilleure façon de le faire?
source d'informationauteur Jeremy Logan
Vous devez vous connecter pour publier un commentaire.
Utiliser un
Calendar
pour obtenir ce que le décalage était dans les locaux de l'Époque, puis l'ajouter au local de l'époque d'horodatage.Malheureusement, cela semble être la meilleure façon de le faire:
(Je sais que c'est plusieurs mois après le post date, mais c'est un problème qui est très utile pour résoudre lorsque l'on travaille avec des messages texte sur Android. dave réponse est fausse.)
À l'aide de Joda le Temps, il sera comme ceci :
ÉDITÉ: Désolé, c'est la version correcte :
En fait, Chris Lercher frappé le clou sur la tête, mais il ne l'a faite que dans un bref commentaire, donc je voulais étendre sur elle.
Imaginer deux chronomètres; l'un est un endroit où l'UTC est le heure locale, à partir du 1er janvier 1970, et de l'autre chronomètre est local à votre région (disons que c'est à New York, 5 heures après l'heure UTC). Au UTC minuitsur janvier 1, 1970, l'UTC chronomètre est démarré. 5 heures plus tard, votre local chronomètre est démarré. Ces deux temps du chronomètre diffèrent par certains montant déterminé seulement par ce que la différence entre l'UTC a été à partir de votre heure locale à minuit, heure locale sur janvier 1, 1970. Toute lumière-économie manigances, depuis lors, n'ont pas d'incidence sur la différence entre ces chronomètres. Alors, tout d'heure d'été corrections pour votre présent temps ou pour le temps que vous êtes conversionne sont pas pertinents. Tous vous avez besoin est de savoir comment beaucoup plus tard votre local chronomètre a commencé le 1er janvier 1970.
Comme Chris l'a souligné, c'est juste: getOffset(0L), donc:
... ) devrait fonctionner. Cependant....
Pour aider à vraiment saisir cette, remarque: "0L" dans getOffset() est le nombre de millisecondes depuis l'UTC époque (qui est le seul réel époque). Donc, votre décalage variable est le nombre de secondes de décalage à minuit UTC (c'est à dire, quand il a été, disons, 19:00 sur 12/31/1969 à New York). Si votre temps passé à/de lumière-économie dans les dernières heures avant la local minuit, puis getOffset(0L) ne serait pas correct. Vous devez savoir ce que votre lumière-économie d'état était à local minuit, pas d'UTC minuit.
Je serais surpris si c'était le cas, n'importe où (c'est à dire, n'importe quel fuseau horaire qui a changé à/de l'heure d'été entre leurs minuit heure locale et l'heure UTC à minuit le 1er janvier 1970). Cependant, juste pour le plaisir, un hack pour vous prémunir contre ce serait de vérifier si le décalage changé au cours de ces heures d'ouverture:
Ici, localMidnightOffset ce que le décalage horaire a été à un moment -décalage de quelques millisecondes après minuit UTC en 1970. Si pas de changement d'heure d'été qui s'est passé, puis localMidnightOffset sera égal à décalage, et vous avez terminé. Si certains d'heure d'été changement ne se produire, alors vous pourriez avoir à chasser autour... probablement continuer à faire un
jusqu'à ce qu'il cesse de changer... et j'espère que vous ne soyez pas pris dans une boucle sans fin. Je suis curieux de voir si quelqu'un a une garantie de convergence de la solution.
Fait un peu vous voulez que le monde était plat, hein?
Pas, qui ne fonctionnera certainement pas - ne pas prendre en compte de l'heure d'été. Vous ne pouvez pas utiliser
getOffset(oldTime)
soit, comme l'heure d'été peuvent avoir changé entre les deux...Vous pouvez utiliser
getOffset(oldTime)
pour obtenir une estimation initiale à l'horodateur, puis vérifiergetOffset(utcTime)
pour voir si elles sont identiques ou pas. Cela devient drôle, en fait.Joda Time devrait l'appui de cette aide
DateTimeZone.getOffsetFromLocal
mais c'est légèrement cassée (OMI) autour de l'heure d'été transitions.Tout cela dépend vraiment de ce que tu veux dire par "nombre de millisecondes depuis le local de l'époque". Si vous vraiment moyen écoulé en millisecondes depuis le local 1970, vous avez juste à trouver le décalage à cette date, et de l'appliquer indépendamment. Généralement (IME) un "local" millis valeur ne signifie pas tout à fait ce que cela signifie "le nombre de millis pour se rendre à une date et une heure précises (par exemple, le 9 avril 2010, 18:06pm) UTC, mais à l'égard d'un autre fuseau horaire". En d'autres termes, il peut représenter l'ambigu, voire impossible, de date/heure combinaisons en fonction de l'heure d'été transitions.
Cela a fonctionné pour moi de me convertir à l'UTC.
Peut-être cela peut vous aider j'ai essayer de cette façon. S'il vous plaît commentaire moi si il y a de bons et d'optimiser la façon de convertir l'heure locale en temps UTC timestamp.
Appel :
getConvertedTimeToUTC(mDate,mDateFormat);
Voici le résultat : (Réf : case de conversion)