La conversion de chaîne de caractères contenant localtime en UTC, dans C
J'ai une chaîne contenant une date/heure et j'ai besoin de convertir un time_t valeur (en UTC) - j'ai essayé ceci:
char* date = "2009/09/01/00";
struct tm cal = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL};
strptime(date, "%Y/%m/%d/%H", &cal);
time_t t = mktime(&cal);
mais time_t valeur je serai de retour est la valeur que j'allais attendre si la chaîne a été analysée comme UTC pas de temps local. J'ai peut-être mal compris ce que strptime est censé faire, mais dans mon fuseau horaire (royaume-UNI), le 1er septembre, nous sommes à l'aide de la BST (soit UTC + 1 heure) donc j'attendrais la valeur, je me retrouve avec 1 heure d'avance sur l'heure UTC.
Est-il un moyen d'interpréter la chaîne que localtime, en prenant automatiquement en compte le décalage UTC qui aurait été en vigueur à cette date? Notez que j'ai besoin de la time_t valeur pas une struct tm, dans l'exemple ci-dessus, je veux time_t valeur pour correspondre à 2009-09-01 01:00:00 GMT
OriginalL'auteur codebox | 2009-11-19
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
mktime
pour interpréter une struct tm dans le fuseau horaire local. Lorsque vous le faites, veillez à définir letm_isdst
drapeau. C'est 0 pour l'été, 1 pour l'hiver, et -1 pour avoirmktime
comprendre. Voici un exemple de code:Cette affiche (j'habite en GMT+1, et c'est l'hiver maintenant):
Il ressemble
mktime
convertit une date en septembre basées sur l'heure d'été. C'est novembre, alors c'est effectivement d'une heure. Je n'ai pas trouvé un moyen de corriger cela.La convention C est pour stocker time_t comme le nombre de secondes depuis le 1970-01-01 en UTC. Il est changé en localtime seulement pour l'interprétation ou l'affichage. Si vous souhaitez introduire rob_t comme le localtime variante, vous pouvez calculer le nombre de secondes entre gmtime() et localtime() et l'ajouter à votre time_t. 🙂
ok, mais je veux interpréter la chaîne de caractères que l'heure locale, de ne pas produire un localtime équivalent d'une heure UTC de la chaîne. Dans notre exemple, en supposant que nous vivons dans GMT+1, la chaîne "2009/09/01/00" est notre heure locale, et il est donc équivalent à "2009/09/01/01" en GMT, et afin que le code de retour de la time_t valeur correspondant à "2009/09/01/01". Cela fait-il sens?
Droit, ce genre de choses est complexe. S'avère
mktime()
s'attendre à une localtime struct. L'1 heure de décalage dans mon exemple était l'heure d'été, qui a été mis à 0 danscal
, mais est1
pour le moment. Je vais modifier l'exemple.Dans le cas où vous ne souhaitez pas que la conversion à l'heure locale vous pouvez utiliser l'UTC équivalent pour
mktime
qui esttimegm
.OriginalL'auteur Andomar
Voici ma version, à l'aide de
tm_gmtoff
. Heureusement, la bibliothèque prend soin de l'heure d'été ...struct tm
vous passez àmktime
atm_isdst
à 0, donc le temps est lu sans l'heure d'été. Ensuite, vous passez àctime
, qui ne fait correct pour l'heure d'été par l'ajout de 1 heure. Ensuite, vous soustraire le décalage, qui peut prêter à confusion aussi 1 heure, pour obtenir un temps aléatoire. Ce genre de choses me fait tourner la tête, mais j'aimerais aller au fond de celui-ci 🙂Cette heure d'été est drôle d'affaires. Je viens de réaliser que l'heure d'été n'est pas en vigueur actuellement, mais il a été le 1er septembre! Hmmm ... je pense qu'il y a aucun moyen pour que la bibliothèque "savoir" lorsque l'heure d'été commence et se termine à un endroit précis. Je pense que vous avez à gérer l'heure d'été à la main ( timeanddate.com/time/dst2009.html )
OriginalL'auteur pmg
Je pense que j'ai craqué aujourd'hui, grâce à Andomar - ce code fait ce que j'ai besoin et qui semble fonctionner indépendamment de l'actuel statut de l'heure d'été (j'ai changé l'horloge sur mon PC pour vérifier cela):
OriginalL'auteur codebox