Je souhaite analyser la date sans fuseau horaire en JavaScript. J'ai essayé:
new Date(Date.parse("2005-07-08T00:00:00+0000"));
Renvoie le vendredi 8 juillet 2005 02:00:00 GMT + 0200 (heure avancée d'Europe centrale)
new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));
Renvoie le même résultat
new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));
Renvoie le même résultat
Je veux analyser le temps:
Sans fuseau horaire.
Sans appeler le constructeur Date.UTC ou new Date (année, mois, jour).
Juste une simple chaîne de passage dans le constructeur de date (sans approches de prototype).
Je dois faire l'
Date
objet d'un produit , nonString
.
Date.parse
btw et passer directement la chaîne auDate
constructeur.Date
objet pour obtenir l'objet correct pour comparer les dates dans MongoDB:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
Réponses:
La date est correctement analysée, c'est juste toString qui la convertit dans votre fuseau horaire local:
Les objets Javascript Date sont des horodatages - ils contiennent simplement un certain nombre de millisecondes depuis l'époque. Il n'y a pas d'informations de fuseau horaire dans un objet Date. Quelle date calendaire (jour, minutes, secondes) cet horodatage représente est une question d'interprétation (une des
to...String
méthodes).L'exemple ci-dessus montre que la date est correctement analysée - c'est-à-dire qu'elle contient en fait une quantité de millisecondes correspondant à "2005-07-08T11: 22: 33" en GMT.
la source
new Date(Date.parse("2005-07-08T11:22:33+0000"))
et date copiée par le constructeur:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
. Les deux solutions, des résultats différents, deuxième correct! Votre réponse était utile, juste mentionnée dans hunlock.com/blogs/Javascript_Dates-The_Complete_Reference . Up.J'ai le même problème. J'obtiens une date sous forme de chaîne, par exemple: '2016-08-25T00: 00: 00', mais j'ai besoin d'un objet Date avec l'heure correcte. Pour convertir String en objet, j'utilise getTimezoneOffset:
getTimezoneOffset()
renverra une valeur négative ou positive de l'éther. Cela doit être soustrait pour fonctionner dans tous les endroits du monde.la source
var userTimezoneOffset = date.getTimezoneOffset()*60000;
getTimezoneOffset()
renvoie le nombre de minutes dans la direction opposée à laquelle vous pensez - mon fuseau horaire est UTC-4 pour le moment maisgetTimezoneOffset()
renvoie un 240 positif. Par conséquent, iluserTimezoneOffset
doit être soustraitdate.getTime()
et non ajouté.new Date('2016-08-25T00:00:00Z')
je pense que le but était de manipulernew Date('2016-08-25T00:00:00Z')
pour que l'heure locale soit affichée avec l'heure 0:00 mais ce code a manquéZ
J'ai rencontré le même problème, puis je me suis souvenu de quelque chose de bizarre à propos d'un projet hérité sur lequel je travaillais et de la façon dont ils ont géré ce problème. Je ne l'ai pas compris à l'époque et je m'en fichais vraiment jusqu'à ce que je rencontre moi-même le problème
Pour une raison quelconque, le fait de passer la date en tant que «01 -02-2014» définit le fuseau horaire sur zéro et ignore le fuseau horaire de l'utilisateur. Cela peut être un hasard dans la classe Date, mais il existait il y a quelque temps et existe aujourd'hui. Et cela semble fonctionner entre les navigateurs. Essayez-le par vous-même.
Ce code est implémenté dans un projet global où les fuseaux horaires importent beaucoup mais la personne qui regarde la date ne se soucie pas du moment exact où elle a été introduite.
la source
2014/5/31
et2014/05/31
comme Sam 31 mai 2014 00:00:00 GMT-0600 (heure avancée de la montagne) `(MDT étant mon fuseau horaire actuel). Avec des tirets ... tous les navigateurs interprètent2014-05-31
comme ven 30 mai 2014 18:00:00 GMT-0600 (Mountain Daylight Time). Curieusement, avec2014-5-31
, Chrome revient samedi, Firefox revient vendredi et IE11 dit que la date n'est pas valide. On dirait qu'undate.replace('-','/')
pourrait faire l'affaire.L'
Date
objet lui-même contiendra de toute façon le fuseau horaire, et le résultat renvoyé est l'effet de sa conversion en chaîne par défaut. C'est-à-dire que vous ne pouvez pas créer un objet de date sans fuseau horaire. Mais ce que vous pouvez faire est d'imiter le comportement de l'Date
objet en créant le vôtre. Il est cependant préférable de le remettre à des bibliothèques comme moment.js .la source
solution simple
la source
La date en javascript est simplement simple à l'intérieur. les données date-heure sont donc stockées à l'époque unix UTC (millisecondes ou ms).
Si vous voulez avoir une heure "fixe" qui ne change pas quel que soit le fuseau horaire dans lequel vous vous trouvez sur terre, vous pouvez ajuster l'heure en UTC pour qu'elle corresponde à votre fuseau horaire local actuel et l'enregistrer. Et lorsque vous le récupérez, quel que soit votre fuseau horaire local dans lequel vous vous trouvez, il affichera l'heure UTC ajustée en fonction de celui qui l'a sauvegardée et ajoutera le décalage du fuseau horaire local pour obtenir l'heure "fixe".
Pour enregistrer la date (en ms)
Pour récupérer / afficher la date (en ms)
Ensuite vous pouvez:
la source
Vous pouvez utiliser ce code
la source
Puisqu'il s'agit vraiment d'un problème de formatage lors de l'affichage de la date (par exemple, les affichages en heure locale), j'aime utiliser le nouvel objet (ish) Intl.DateTimeFormat pour effectuer le formatage car il est plus explicite et fournit plus d'options de sortie:
Comme indiqué, en définissant la zone horaire sur «UTC», il n'effectuera pas de conversions locales. En prime, il vous permet également de créer des sorties plus soignées. Vous pouvez en savoir plus sur l' objet Intl.DateTimeFormat de Mozilla - Intl.DateTimeFormat .
Éditer:
La même fonctionnalité peut être obtenue sans créer un nouvel
Intl.DateTimeFormat
objet. Passez simplement les options de paramètres régionaux et de date directement dans latoLocaleDateString()
fonction.la source
Juste une note générique. un moyen de le garder flexible.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Nous pouvons utiliser getMinutes (), mais il ne renvoie qu'un seul nombre pendant les 9 premières minutes.
la source
(new Date().toString()).replace(/ \w+-\d+ \(.*\)$/,"")
Cela aura la sortie: Tue Jul 10 2018 19:07:11
(new Date("2005-07-08T11:22:33+0000").toString()).replace(/ \w+-\d+ \(.*\)$/,"")
Cela aura la sortie: Fri Jul 08 2005 04:22:33
Remarque: l'heure renvoyée dépendra de votre fuseau horaire local
la source
C'est la solution que j'ai trouvée pour ce problème qui fonctionne pour moi.
bibliothèque utilisée: momentjs avec la classe Date javascript.
Étape 1. Convertissez la date de chaîne en objet moment (PS: moment conserve la date et l'heure d'origine tant que la
toDate()
méthode n'est pas appelée):const dateMoment = moment("2005-07-08T11:22:33+0000");
Étape 2. Extrait
hours
etminutes
valeurs de l'objet Moment créé précédemment:Étape 3. Convertissez le moment en date (PS: cela changera la date d'origine en fonction du fuseau horaire de votre navigateur / machine, mais ne vous inquiétez pas et lisez l'étape 4.):
Étape 4. Réglez manuellement les heures et les minutes extraites à l'étape 2.
Étape 5.
dateObj
va maintenant afficher la date d'origine sans aucune différence de fuseau horaire. Même les changements d'heure d'été n'auront aucun effet sur l'objet de date car nous définissons manuellement les heures et les minutes d'origine.J'espère que cela t'aides.
la source
Il existe des problèmes inhérents à l'analyse des dates qui ne sont malheureusement pas bien résolus par défaut.
-Les dates lisibles par l'homme ont un fuseau horaire implicite
-Il existe de nombreux formats de date largement utilisés sur le Web qui sont ambigus
Pour résoudre ces problèmes facilement et proprement, il faudrait une fonction comme celle-ci:
J'ai cherché ceci, mais je n'ai rien trouvé de tel!
J'ai donc créé: https://github.com/zsoltszabo/timestamp-grabber
Prendre plaisir!
la source