Comment faire pour convertir l'heure Locale à l'heure UTC en Delphi XE2? et comment faire pour le convertir en arrière de l'heure UTC en heure locale?
Je suis en utilisant Delphi xe2, et je suis en train de stocker des enregistrements à l'aide UTC datetime dans ma base de données, puis de le restaurer quand un client se lit dans ses locaux datetime ? une idée de comment faire cela en avant dos de conversion ?
OriginalL'auteur Dreamer64 | 2013-03-22
Vous devez vous connecter pour publier un commentaire.
C'est la fonction que j'utilise pour convertir UTC locales.
Comme vous pouvez le voir, la fonction transforme la date UTC temps comme suit:
Il devrait être évident, comment faire pour inverser cette tendance.
Noter que cette conversion traite de l'heure d'été comme il est maintenant plutôt que comme c'est/a été au moment d'être converti. Le
DateUtils.TTimeZone
type, introduit dans le XE, les tentatives de le faire. Le code devient:Dans l'autre sens, l'utilisation
ToUniversalTime
.Cette classe semble être (vaguement) calqué sur le modèle .net
Fuseau horaire
classe.Un mot d'avertissement. N'attendez pas que la tentative pour tenir compte de l'heure d'été à l'heure d'être convertis pour être précis à 100%. Il est tout simplement impossible à réaliser. Au moins sans une machine de temps. Et c'est juste compte tenu de moments dans le futur. Même des fois dans le passé sont complexes. Raymond Chen aborde la question ici: Pourquoi l'Heure d'été est non intuitives.
Qui dépend des exigences.
Ayant un paramètre appelé UTCDateTime, et une fonction appelée UTCDateTime, à la fois avec le même type, me fait mal à la tête. Je pense que votre utilisation prévue est d'utiliser l'un ou l'autre, mais la façon de le présenter, le fait ressembler à LocalDateTimeFromUTCDateTime() veut appeler l'UTCDateTime fonction, mais en réalité ne le sera pas, car il utilise le UTCDateTime paramètre. Un peu déroutant.
Votre code n'est pas correct. Lorsque l'UTC heure unix a été 567302400, sur mon horloge était de 1:00 parce que nous avons eu le temps standard. Mais votre fonction sorties 2:00 (de cette écriture, nous avons actuellement de l'heure d'été). Raymond Chen recommande l'utilisation de
SystemTimeToTzSpecificLocalTimeEx
au lieu deFileTimeToLocalFileTime
par exemple parce qu'il respecte l'heure d'été de l'horodatage au lieu d'utiliser le courant de l'heure d'été, ce qui est important conversion historique des horodateurs à un homme, lisible à la fois. (voir goo.gl/t94UNi ) Cependant, la solution à l'aide deTTimeZone.Local.ToLocalTime
est correct.Ok, j'ai peut-être une autre attente sur ce que cette fonction devrait le faire. Mais à côté de cela, il a implicitement dit dans votre post que votre fonction
LocalDateTimeFromUTCDateTime
est le complexe variante deTTimeZone.Local.ToLocalTime
. Ce n'est pas vrai puisqueDateUtils.Local.ToLocalTime
donne un résultat différent de votre code, si elle est appliquée à des valeurs historiques. Vous devez l'indiquer clairement dans le post que les deux solutions ont un comportement différent. L'un n'est pas "simplifié" variante de l'autre.OriginalL'auteur David Heffernan
vous pouvez utiliser TzSpecificLocalTimeToSystemTime et fonction systemtimetotzspecificlocaltime de kernel32.
La fonction systemtimetotzspecificlocaltime fonction peut calculer l'heure locale de manière incorrecte dans les conditions suivantes: Le fuseau horaire utilise un autre décalage UTC pour l'ancien et le nouveau ans. L'heure UTC à convertir et le calcul de l'heure locale sont à des années différentes. msdn.microsoft.com/de-de/library/windows/desktop/...
Il y a une petite erreur dans le code ci-dessus. Dans UnivDateTime2LocalDateTime, la ligne DateTimeToSystemTime(d,LocalTime); devrait lire DateTimeToSystemTime(d,UniversalTime);
merci beaucoup.
OriginalL'auteur bummi
Que vous utilisez XE2, vous pouvez utiliser le
System.DateUtils.TTimeZone
.Vous pouvez le vérifier bon post expliquant les méthodes et la façon dont il fonctionne et exemples :
http://alex.ciobanu.org/?p=373
OriginalL'auteur Whiler
Si votre client utilise un local Delphi application, ce qui peut être fait avec le Système de fonctions de date.
Toutefois, si vous êtes dans un environnement client/serveur (par exemple en Delphi application est un serveur web, et le client reçoit uniquement les pages HTML), vous avez besoin de les convertir à la locale de l'utilisateur, le temps différemment. Le serveur a besoin de savoir le temps de l'utilisateur de la zone, et de convertir de façon appropriée.
Aussi l'heure d'été peut causer des maux de tête si l'application a besoin de convertir les données historiques - vous besoin de savoir si il y avait de l'heure d'été en vigueur pour l'utilisateur de la région.
Dans ces cas d'utilisation, les Fuseau Horaire de la Base de données de Delphi peut être utile.
Je ne savais pas qu'il y est fonction systemtimetotzspecificlocaltime mais viens de lire que Jon Skeet préfère TZDB pour le temps de la zone de manutention.
OriginalL'auteur mjn