Arrêter de javascript en fonction de la Date de changement de fuseau horaire décalage
J'ai donc iso date du temps qui doit être convertie en une chaîne de caractères de l'objet date. Comment puis-je garder la date de la conversion de locaux navigateur fuseau horaire.
new Date('2013-07-18T17:00:00-05:00')
Thu Jul 18 2013 18:00:00 GMT-0400 (EDT)
Je veux obtenir
Thu Jul 18 2013 17:00:00 GMT-0500 (XX)
- Le point de la norme ISO formaté les dates doivent être convertis dans votre fuseau horaire...
- Vous ne pouvez pas. JavaScript
Date
objet ne stocke pas les informations de fuseau horaire, et lors de la sortie/toStringing/journalisation, ils vont utiliser votre navigateur local fuseau horaire (malheureusement défaut) ou l'heure UTC (avec des méthodes explicites). - Mais si ce que je suis en train d'affichage n'est pas dans les navigateurs fuseau horaire. Pourquoi ne peux-date d'analyser la chaîne et de fixer la date de l'objet pour le décalage horaire spécifié dans la norme iso chaîne.
- Si vous utilisez UTC/GMT, il y a toUTCString() developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
- Je viens de lancer dans ce et FireFox ne plaisante pas avec mes dates mais tous les autres navigateurs.
- momentjs.com/timezone \_(ツ)_/
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas modifier ce comportement de Javascript car c'est le seul moyen simple de Javascript pour fonctionner. Ce qui se passe est tout simplement que Javascript regarde le time shift, calcule l'appariement d'horodatage, puis demande à l'OS pour la représentation de cette date /heure dans le fuseau horaire local. Quelle est la clé pour comprendre ici, c'est que
-05:00
n'est pas une indication de fuseau horaire mais simplement d'un changement de l'heure UTC.Les fuseaux horaires sont complexes bêtes qui sont juste à l'arbitraire des décisions politiques. Le système d'exploitation fournit un service pour afficher l'heure dans le fuseau horaire local, mais pas dans d'autres fuseaux horaires. Pour ce faire vous devez prendre en compte des choses comme l'heure d'été qui sont un peu un enfer.
Comme toujours avec la gestion du temps, la seule manière décente pour s'attaquer à ce problème est d'utiliser une bibliothèque dédiée. En Javascript, vous trouverez Moment.js et Moment.Timezone.js très utile.
Exemple http://codepen.io/Xowap/pen/XKpKZb?editors=0010
Comme un bonus, vous obtenez une tonne de mise en forme/analyse des caractéristiques de Moment.js.
Veuillez également noter que tant que vous utilisez la norme ISO 8601, votre date peut être localisée à un moment précis, et ainsi affichée dans n'importe quel fuseau horaire de votre goût. En d'autres termes, JS "conversion" de votre date n'a pas d'importance.
Vous pouvez utiliser une bibliothèque comme Moment.js pour ce faire.
Voir le Chaîne + Format de l'analyse.
http://momentjs.com/docs/#/parsing/string-format/
Les éléments suivants doivent analyser votre date que vous avez fourni, mais vous devrez peut-être modifier selon vos besoins.
Sinon, voir le Moment de la Chaîne de l'analyseur, qui ressemble, il est dans le format que vous avez fournies, à l'exception d'un espace entre les secondes de l'heure et du fuseau horaire.
http://momentjs.com/docs/#/parsing/string/
Tout MomentJS est une grande bibliothèque, il ne peut pas fournir une solution pour chaque cas d'utilisation. Par exemple, mon serveur fournit les dates de l'UTC, et lorsque la portion de la date n'est pas enregistré dans la base de données (parce que c'est sans importance), le client reçoit une chaîne qui a une durée par défaut de tous les zéros - minuit et se termine avec un décalage de
+0000
. Le navigateur, puis ajuste automatiquement pour mon fuseau horaire local et tire le temps en quelques heures, résultant dans la journée précédente.C'est vrai avec MomentJs ainsi.
La seule solution est de couper la portion de la chaîne, et ensuite utiliser MomentJS comme décrit dans les autres réponses.
Mais qu'advient-il si MomentJS n'est pas une option viable, c'est à dire j'ai déjà beaucoup d'endroits qui utilisent un JS de la Date et de ne pas mettre à jour si le nombre de lignes de code? La question est de savoir comment arrêter le navigateur de convertir les dates en fonction de l'heure locale de la zone en premier lieu. Et la réponse est que, lorsque la date est au format ISO, vous ne pouvez pas.
Cependant, il n'y a pas de règle qui dit que la chaîne que vous avez passer à du JavaScript constructeur de Date doit être au format ISO. Si vous remplacez simplement le
-
qui sépare l'année, le mois et le jour avec un/
, votre navigateur pas effectuer la conversion.Dans mon cas, j'ai simplement changé le format des Dates côté serveur, et le problème a été résolu sans avoir à mettre à jour côté client JS dates avec MomentJS.
Noter que le MDN docs pour le JavaScript de la classe Date avertir imprévisible navigateur comportement lors de l'analyse d'une chaîne de créer une instance de Date.
Me demande si cela peut aider:
Avec votre entrée:
Toutefois, si vous commencez à les modifier cette date, le toString sera pas changement et va vous mordre.
setHour
ou quelque chose).C'est une vieille question qui a récemment été lié dans une réponse à une nouvelle question, mais aucune des réponses semblent répondre entièrement à la question d'origine.
Dans de nombreux cas, la façon la plus simple de formater et afficher un datetime chaîne dans la zone de l'heure qu'il est reçu, n'est pas de convertir la chaîne en
Date
objet. Au lieu de cela, juste analyser la dateheure chaîne et de recombiner les pièces dans le format désiré. Par exemple, si vous pouvez vivre sans le jour de la semaine dans la sortie demandée dans la question, vous pourriez faire quelque chose comme ce qui suit pour gérer la saisie et le format de sortie (y compris le jour de la semaine, ajoute assez de complexité qu'il pourrait être utile d'utiliser une bibliothèque à ce point). Bien sûr, cette approche nécessite une modification basée sur le format de la date /heure de chaînes que vous recevez sur le côté client.JS:
Il y a de JavaScript et d'autres méthodes de bibliothèques qui vous permettra de convertir vos datetime chaîne
Date
instance, puis l'afficher dans un fuseau horaire spécifique si vous avez constamment la réception datetime des chaînes à partir d'un ou de quelques temps, les zones qui sont facilement identifiées sur le côté client. Suivants sont quelques exemples.toLocaleString
vous permet d'afficher une date dans un fuseau horaire spécifique, mais laoptions
paramètres nécessaires pour définir le fuseau horaire ne sont pas pris en charge dans tous les navigateurs (à compter de la date de cette réponse). Par exemple (à noter que l'analyse de la date de chaînes avec l'Date
constructeur est encore découragé, mais la plupart des navigateurs récents gérer un format ISO 8601 chaîne comme celle ci-dessous):JS:
Vous pouvez également utiliser Moment.js avec Moment Fuseau Horaire affiche une date dans un fuseau horaire spécifique. Par exemple:
JS:
HTML:
Il est important de noter les points suivants lorsque vous travaillez avec datetime des chaînes et des fuseaux horaires en JavaScript. Le JavaScript
Date
constructeur NE change PAS le décalage horaire. Lorsque vous créer une date à partir d'une chaîne à l'aide de la norme ISO 8601 comme dans la question exemple,Date
effectue les opérations suivantes:En d'autres termes, JavaScript
Date
instances ne pas stocker (ou modifier) décalages de fuseau horaire. La raison pour laquelle vous voyez souvent la sortie d'un JavaScriptDate
dans votre fuseau horaire local est quetoString
est la valeur par défaut de la méthode appelée lorsque vous vous connectez unDate
instance de la console (ou l'utilisation de diverses autres approches à la sortie de votre date). Dans la plupart des navigateur mises en œuvre, cette méthode s'appuie sur le navigateur de l'heure locale de la zone de convertir le nombre de millisecondes depuis le 1er janvier 1970 UTC dans une représentation de chaîne de la date.