Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème de date

2 réponses
Avatar
Une Bévue
j'ai une date en string provenant d'une database :
"2012-10-06 08:48:27 UTC"

sur Safari, Google Chrome et Opera Next, pas de pb, avec le script suivant :
function ISODate2frFR(datetime){
console.log("ISODate2frFR(" + datetime + ")");
var jours =
['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'];
var mois =
['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'];
var str = "Le ";
var date = new Date(datetime);
console.log("ISODate2frFR(" + datetime + ") -> date = " + date
+ "");
str += jours[date.getDay()] + " ";
str += date.getDate() + " ";
str += mois[date.getMonth()] + " ";
str += date.getFullYear() + " à ";
str += date.getHours() + "H";
var mn = date.getMinutes();
str += (mn<10)? "0" + mn + ":" : mn + ":";
var s=date.getSeconds();
str += (s<10)? "0" + s : s;
return str;
}

je parvient à convertir cette date en :
"Le samedi 6 octobre 2012 à 10H48:27"
ce qui me semble correct.

Mais Firefox Nightly me donne, pour la même date :
"Le undefined NaN undefined NaN à NaNHNaN:NaN"
c'est parce que le
console.log("ISODate2frFR(" + datetime + ") -> date = " + date + "");
donne :
"ISODate2frFR(2012-10-06 08:48:27 UTC) -> date = Invalid Date"

qu'est-ce qu'il y a d'invalide dans cette date ?
FF ne fonctionnerait pas de la même manière que les autres butineurs
pour la date ?

2 réponses

Avatar
Olivier Miakinen
Bonjour,

Le 30/12/2014 17:12, Une Bévue a écrit :
j'ai une date en string provenant d'une database :
"2012-10-06 08:48:27 UTC"

[...]

Mais Firefox Nightly me donne, pour la même date :
"Le undefined NaN undefined NaN à NaNHNaN:NaN"
c'est parce que le
console.log("ISODate2frFR(" + datetime + ") -> date = " + date + "");
donne :
"ISODate2frFR(2012-10-06 08:48:27 UTC) -> date = Invalid Date"

qu'est-ce qu'il y a d'invalide dans cette date ?



Les espaces et le "UTC" à la place d'un "T" et d'un "Z".

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
<cit.>
The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ
</cit.>

Note : lire la suite de la norme pour les parties optionnelles. Par
exemple, ça fonctionne avec :
var date = new Date("2012-10-06T08:48:27");

FF ne fonctionnerait pas de la même manière que les autres butineurs
pour la date ?



Je pense que rien n'interdit d'accepter des formats non standards, et
les autres butineurs que tu as essayés le font. Mais si tu veux que ça
fonctionne partout il vaut mieux respecter le standard.
Avatar
Une Bévue
Le 30/12/14 21:26, Olivier Miakinen a écrit :
Je pense que rien n'interdit d'accepter des formats non standards, et
les autres butineurs que tu as essayés le font. Mais si tu veux que ça
fonctionne partout il vaut mieux respecter le standard.



OK, OK, merci beaucoup.

bon pour l'instant j'ai hacké avec :
datetime = datetime.replace(/ UTC/, "Z").replace(/ /, "T");

mais bon ça ne me satisfait pas car dans ma base de donnée j'ai un time
stamp UTC en iso 8601 et, peut-être, le driver de cette bd en ruby me
donne un Time (objet) et c'est lui qui est converti en
"2014-12-31 05:38:34 UTC"
(sans doute est-ce la méthode #to_s ( équivalent ruby du toString() js)
qui donne ce format au lieu de l'iso 8601)

Bon, finalement j'ai modifié, en ruby, le JSON.generate pour Time :


class Time
def to_json(arg = nil)
return '"' + self.iso8601 + '"'
end
end


ATTENTION, en ruby (suivant
<http://devblog.avdi.org/2009/10/25/iso8601-dates-in-ruby/>), pour que
la méthode #iso8601 soit reconnue il faut faire un "require 'time'" avant...

le driver MongoDB en php est plus respectueux des formats...