SIMPLEDATEFORMAT SIMILAIRE À LA CLASSE JAVA

grumelo68 Messages postés 7 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 5 mai 2008 - 11 juil. 2007 à 14:31
grumelo68 Messages postés 7 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 5 mai 2008 - 5 mai 2008 à 15:01
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40422-simpledateformat-similaire-a-la-classe-java

grumelo68 Messages postés 7 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 5 mai 2008
5 mai 2008 à 15:01
Pour éviter tous les problèmes d'affichage j'ai converti tous les caractères en leur équivalent HTML

DateFormatSymbols.CONST={'ca':[['gener','febrer','març','abril','maig','juny','juliol','agost','setembre','octubre','novembre','desembre'],['gen.','feb.','març','abr.','maig','juny','jul.','ag.','set.','oct.','nov.','des.'],['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'],['dg.','dl.','dt.','dc.','dj.','dv.','ds.']],'da':[['januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december'],['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'],['sřndag','mandag','tirsdag','onsdag','torsdag','fredag','lřrdag'],['sř','ma','ti','on','to','fr','lř']],'de':[['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],['Jan','Feb','Mrz','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'],['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],['So','Mo','Di','Mi','Do','Fr','Sa']],'en':[['January','February','March','April','May','June','July','August','September','October','November','December'],['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],['Sun','Mon','Tue','Wed','Thu','Fri','Sat']],'es':[['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'],['ene','feb','mar','abr','may','jun','jul','ago','sep','oct','nov','dic'],['domingo','lunes','martes','miércoles','jueves','viernes','sábado'],['dom','lun','mar','mié','jue','vie','sáb']],'et':[['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni','Juuli','August','September','Oktoober','November','Detsember'],['Jaan','Veebr','Märts','Apr','Mai','Juuni','Juuli','Aug','Sept','Okt','Nov','Dets'],['pühapäev','esmaspäev','teisipäev','kolmapäev','neljapäev','reede','laupäev'],['P','E','T','K','N','R','L']],'fi':[['tammikuu','helmikuu','maaliskuu','huhtikuu','toukokuu','kesäkuu','heinäkuu','elokuu','syyskuu','lokakuu','marraskuu','joulukuu'],['tammi','helmi','maalis','huhti','touko','kesä','heinä','elo','syys','loka','marras','joulu'],['sunnuntai','maanantai','tiistai','keskiviikko','torstai','perjantai','lauantai'],['su','ma','ti','ke','to','pe','la']],'fr':[['janvier','février','mars','avril','mai','juin','juillet','aoűt','septembre','octobre','novembre','décembre'],['janv.','févr.','mars','avr.','mai','juin','juil.','aoűt','sept.','oct.','nov.','déc.'],['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'],['dim.','lun.','mar.','mer.','jeu.','ven.','sam.']],'is':[['janúar','febrúar','mars','aprěl','maě','júně','júlě','ágúst','september','október','nóvember','desember'],['jan.','feb.','mar.','apr.','maě','jún.','júl.','ágú.','sep.','okt.','nóv.','des.'],['sunnudagur','mánudagur','ţriđjudagur','miđvikudagur','fimmtudagur','föstudagur','laugardagur'],['sun.','mán.','ţri.','miđ.','fim.','fös.','lau.']],'it':[['gennaio','febbraio','marzo','aprile','maggio','giugno','luglio','agosto','settembre','ottobre','novembre','dicembre'],['gen','feb','mar','apr','mag','giu','lug','ago','set','ott','nov','dic'],['domenica','lunedě','martedě','mercoledě','giovedě','venerdě','sabato'],['dom','lun','mar','mer','gio','ven','sab']],'nl':[['januari','februari','maart','april','mei','juni','juli','augustus','september','oktober','november','december'],['jan','feb','mrt','apr','mei','jun','jul','aug','sep','okt','nov','dec'],['zondag','maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag'],['zo','ma','di','wo','do','vr','za']],'no':[['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],['sřndag','mandag','tirsdag','onsdag','torsdag','fredag','lřrdag'],['sř','ma','ti','on','to','fr','lř']],'pt':[['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],['Dom','Seg','Ter','Qua','Qui','Sex','Sáb']],'sl':[['januar','februar','marec','april','maj','junij','julij','avgust','september','oktober','november','december'],['jan','feb','mar','apr','maj','jun','jul','avg','sep','okt','nov','dec'],['Nedelja','Ponedeljek','Torek','Sreda','?etrtek','Petek','Sobota'],['Ned','Pon','Tor','Sre','?et','Pet','Sob']],'sv':[['januari','februari','mars','april','maj','juni','juli','augusti','september','oktober','november','december'],['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'],['söndag','mĺndag','tisdag','onsdag','torsdag','fredag','lördag'],['sö','mĺ','ti','on','to','fr','lö']]}

Penses tu implémenter la conversion du time zone ?
Si non, peux tu me contacter pour que je le fasse ? J'en ai vraiment besoin.
tarzent Messages postés 30 Date d'inscription vendredi 12 juillet 2002 Statut Membre Dernière intervention 15 mai 2009
6 févr. 2008 à 11:48
Salut,

Si tu veux être sûr que ça passe, déclare ta constante après la définition de ta classe.
Et si tu veux faire des trucs clean, je te conseille vivement prototype : http://www.prototypejs.org

@+
grumelo68 Messages postés 7 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 5 mai 2008
6 févr. 2008 à 11:30
Coucou, c'est encore moi :D

Comment tu peux écrire dans ton code :

# SimpleDateFormat.YEAR = new Number(_FULL_YEAR.substring(2));
#
# function SimpleDateFormat(pattern, lang, lenient) {

Sans que ça explose ???

Tu défini une propriété à une classe avant même que celle ci ne soit créée ?
Ce que je ne comprends c'est que dans ton script ça marche et alors que si j'essaye de faire pareil dans les miens je me prend un bon gros NOT DEFINED.
tarzent Messages postés 30 Date d'inscription vendredi 12 juillet 2002 Statut Membre Dernière intervention 15 mai 2009
9 janv. 2008 à 16:45
ok, merci je prend note !
grumelo68 Messages postés 7 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 5 mai 2008
9 janv. 2008 à 16:37
Ok j'ai trouvé le "bug".
Tu n'avais aucune chance de le trouvé sans jouer avec les time zone de ton ordi.

Quand dans generateDateWithDatas() tu fais :
var d = new Date(0);
d.setHours(0);

Tu as simplement oublié d'ajouter :
d.setDate(1);

Car avec un time zone différent (celui des US par exemple) new Date(0) ne renvoie pas le 1er janvier 1970 mais le 31 décembre 1969.

Donc quand tu vas essayer de changer le mois de la variable d avec le moi de février par exemple tu passes automatiquement au mois suivant. Voila pourquoi tous les mois qui n'ont pas 31 jours n'étais pas converti correctement.

Voici un petit code tout bête pour vérifier mes dires :

<script type="text/javascript">
var myDate = new Date(0);
var HTML = "- -
";
HTML += myDate;
myDate.setFullYear(2007);
HTML += "
";
HTML += myDate;
myDate.setMonth(1);
HTML += "
";
HTML += myDate;
document.getElementById('testDiv').innerHTML = HTML2;
</script>

Avec une time zone americaine bonjour la surprise :D
grumelo68 Messages postés 7 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 5 mai 2008
9 janv. 2008 à 15:24
Je viens de rencontrer un problème sérieux avec la librairie.

Je sais qu'elle ne gère pas le time zone, cependant si je change la time zone de ma machine avec -GMT -0600 (Central Standard Time) et que j'essaye de convertir 01.02.2007 je me retrouve au mois de mars ??!

C'est apparement la function setMonthWithDatas qui s'envole ou disons en tout cas que generateDateWithDatas ne renvoie pas la bonne valeur. C'est sdf.parse('01.02.2007') qui ne renvoie pas la bonne valeur.

Voici mon code :

<script type="text/javascript">
var dateFormatI = 'dd.MM.yyyy';
var dateFormatO = "''MMM dd, yyyy''";
var timeFormatI = "HH:mm:ss";
var timeFormatO = "HH:mm:ss";
var language = 'en';

var sdf = new SimpleDateFormat(dateFormatI,'en',false);
var sdf2 = new SimpleDateFormat(dateFormatO,language,false);

var HTML = sdf2.format(sdf.parse('01.01.2007'));
HTML += " (01.01.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.02.2007'));
HTML += " (01.02.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.03.2007'));
HTML += " (01.03.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.04.2007'));
HTML += " (01.04.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.05.2007'));
HTML += " (01.05.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.06.2007'));
HTML += " (01.06.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.07.2007'));
HTML += " (01.07.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.08.2007'));
HTML += " (01.08.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.09.2007'));
HTML += " (01.09.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.10.2007'));
HTML += " (01.10.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.11.2007'));
HTML += " (01.11.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('01.12.2007'));
HTML += " (01.12.2007)";
HTML += "
";
HTML += sdf2.format(sdf.parse('11.01.2007'));
HTML += " (11.01.2007)";

document.getElementById('testDiv').innerHTML = HTML;
</script>
tarzent Messages postés 30 Date d'inscription vendredi 12 juillet 2002 Statut Membre Dernière intervention 15 mai 2009
27 sept. 2007 à 14:35
Salut Grumelo68,

Tout d'abord, merci pour ces commentaires.

G, z et Z ne sont pas implémentés car je n'ai tout bonnement pas eu le temps. Je le ferai peut-être dans une future version...

Et en ce qui concerne l'heure par défaut, je me suis contenté de copier le comportement par défaut de la classe Java. Et c'est très bien comme ça, puisque la classe retourne ce qui est demandé. Si tu lui demandes de te retourner une Date au format MMM dd, yyyy HH:mm:ss, elle complétera ce qui manque par des valeurs par défaut. La vérification dont tu parles ne doit pas être fait dans cette classe. D'ailleurs, quel serait le comportement de cette vérif ? Si l'utilisateur n'entre que les minutes et pas les heures ou inversement ? Dois-je afficher une heure par défaut + les minutes ou juste les minutes ?? Non... ce genre de vérification n'a vraiment pas sa place ici... La fonction annonce qu'elle retourne une heure alors elle retournera une heure ! Même si elle doit elle même lui donner une valeur.

Tu peux cependant mettre rapidement une solution en place en testant toi même si l'heure a été renseignée. Tu utiliserais alors 2 objets SimpleDateformat différent selon les cas.

var dateFormat = new SimpleDateFormat('dd/MM/yyyy');
var dateTimeFormat = new SimpleDateFormat('dd/MM/yyyy HH:mm:ss');
var dateString = isDateTime()
? dateTimeFormat.format(ta_date)
: dateFormat.format(ta_date);

A toi d'implémenter la fonction isDateTime en fonction de tes besoins...

@+,
tarzent
grumelo68 Messages postés 7 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 5 mai 2008
11 juil. 2007 à 15:16
G, z et Z ne sont pas implementés.
Ce serait bien dans ce cas de qu'en même les parser même si ils ne sont pas traités.

Car formatter un object date avec MMM dd, yyyy HH:mm:ss z et se retrouver avec 'March 02, 2007 14:05:07 z' c'est moyen.
grumelo68 Messages postés 7 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 5 mai 2008
11 juil. 2007 à 14:31
J'aime pas beaucoup les scripts qui modifient le prototype d'object standard.
C'est vaiment pas une bonne idée surtout dans un environnement non contrôlé.
Ce script est un des rares à gérer à être multilingue, et en plus les traductions sont correctement implementées sous forme d'object et non pas de Arrays multiples.
C'est vraiment bien, j'aime beaucoup.

Pour quoi la timezone n'est pas implémentée ?
Il y a autre chose de très utile qui manque.

Si j'ai une date au format MM/dd/yyyy et que je demande à l'afficher au format MMM dd, yyyy HH:mm:ss, il est regrettable que le parseur ne sache pas reconnaître que je ne fourni pas de données pour l'heure. C'est vraiment une mauvaise habitude de remplacer ce qui manque par l'heure d'execution.

Il faudrait une sorte de flag quelque part qui indique si on traite une date pure ou une date + une heure.
Evidement l'object javascript Date intègre toujours l'heure d'ou l'intérêt dans un pattern de faire la difference entre la date et l'heure et selon les cas d'ignorer l'heure.

Pour quoi je demande ca ? A cause d'un cas simple.
Mon utilisateur défini dans ses préférences qu'il veut voir les objects de type date au format : MMM dd, yyyy HH:mm:ss.
Que ce passe-t-il si mon application ne retourne qu'une date et pas une heure ?
Il n'y aucune raison d'afficher l'heure !
Rejoignez-nous