Strptime avec le Fuseau horaire
J'ai une Chaîne que j'ai analyser avec DateTime.strptime
. Le Fuseau horaire de la Date de la Chaîne est HEC, mais Ruby crée un UTC objet DateTime qui a bien sûr un décalage de 2h.
Actuellement, je suis en train de travailler autour de la question avec DateTime.strptime().change(:offset => "+0020")
mais je suis sûr que ce n'est pas la façon dont il est censé travailler.
Quelqu'un peut-il m'éclairer sur la manière correcte de le faire?
- si vous êtes dans un pays avec CEST/HEC fuseau horaire fixe décalage ne fonctionne pas. Également intéressés par ce sujet, je ne vois pas comment faire strptime analyser pour le fuseau horaire actuel (mais pas la valeur, celle de droite en fonction de la chaîne à analyser).
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas supprimer un a accepté de répondre à
Comme @LeeJarvis souligné dans la section commentaire ci-dessous,
Chronic.parse
ne pas accepter un:time_class
option. Si cette réponse est buggé et tout on dirait qu'il travaille, il n'a pas (à moins de Chroniques permet de passer un:time_class
option bientôt.)La Chronique bijou est vraiment puissant.
Je l'utilise comme ceci:
Dans mon exemple ci-dessus,
User.first.time_zone
est "Pacific Time (US & Canada)".Chronique prend en charge beaucoup de formats, afin de vérifier à
https://github.com/mojombo/chronic
Assurez-vous de passer le
:time_class
option et de se convertir à l'UTC (dans la documentation, Chroniques, jeux de:time_class
avant l'appel à analyser. - Je éviter cette approche, car il peut causer des autres parties à travers l'application de ne pas travailler)Fuseau horaire de la documentation est à
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
parse()
ne pas prendre untime_class
option. Il est configuré sur leChronic
classe directement. Ce sera finalement changer dans les futures versions de la Chronique, bien queJe l'utilise de la manière suivante:
Est-ce ce que tu veux dire?
"09-19-2012 11:08:44" + " CST"
. Je pense que la vôtre est la réponse correcte.À moins que des Rails 4.2 (peut-être plus tôt, ne l'ai pas testé) aussi longtemps que vous utilisez
Time#strptime
au lieu deDateTime.strptime
, le fuseau horaire actuel est automatiquement appliquée:Cela fonctionne dans les Rails 5:
Renvoie l'heure dans le fuseau horaire spécifié.
J'ai été "strptiming" cette chaîne:
Un horodatage local, qui est dans mon cas est de Auckland, nouvelle-zélande, sans un fuseau horaire de timbre à la chaîne, comme peut être vu.
Du mieux que je peux dire
Time.strptime
utilise le serveur fuseau horaire que la base.Dans ma situation, et les bonnes pratiques en général, mes serveurs sont dans le fuseau horaire UTC de sorte que chaque parse de la chaîne a fini par créer un objet de temps, le temps à +0000 (UTC):
Puis de les convertir à
in_time_zone(Time.zone)
a donné:Qui comme on peut le voir est de 12 heures (le décalage UTC) plus tard que le temps que je voulais.
J'ai essayé d'utiliser le
+' Auckland', '...%Z'
truc comme indiqué ci-dessus, sans aucune modification.J'ai ensuite utilisé le
+ '+1200', '...%Z'
truc comme indiqué ci-dessus, qui a fonctionné correctement.Cependant, j'ai été préoccupé par l'heure d'été, puis l'analyse serait hors d'une heure, c'est donc ce que j'ai fini avec:
Résultat:
Il n'est pas particulièrement élégant, mais il fonctionne.
Vous pouvez convertir une date au fuseau horaire avec
to_time_in_current_zone
. Par exemple:J'ai été aux prises avec le même problème en essayant d'analyser une chaîne de date à partir d'un formulaire et l'enregistrer indépendamment des serveurs de temps. Le processus que j'ai suivi en tant que telle.
J'assure le RoR, et Rubis de fuseaux horaires sont définis à l'UTC. Cela rend plus facile si le serveur est sur l'heure UTC en tant que bien.
Je suis de stocker les utilisateurs de paramètres régionaux à l'aide de la ActiveSupport:Fuseau horaire format comme
US/Eastern
J'ai l'interpréter en fonction de la date qui peut représenter une chaîne de date qui n'est pas nativement contenir un fuseau horaire ou de compenser
Bien sûr, cela ne se sent pas comme une solution parfaite, mais il fonctionne.
Les mesures pour assurer le bon fuseau horaire sont:
Pour pré Rails de 5, ce qui suit fonctionnera: