|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
Bonjour, et j'espere que je poste au bon endroit.
je galere depuis hier pour fixer une maniere a gerer les dates ainsi que le decalage horaire. je crée actuellement un site marchand bilingue: francais et anglais (US & UK). j'ai opté pour des fichier xml pour la traduction du site et je suis en version 5.2.14 de PHP 1- lorsqu'un client achete un produit, quelle date d'achat enregistrer dans la base de donné? j'ai pense a mettre la date francaise et dans un autre champ, j'inserer +/-X, où X est le nombre d'heure de decalage. est ce bon ou y a t-il mieux? et comment pourrais je recuperer le nombre d'heures de decalage?? 2- lorsque j'extrais une date d'une bdd, quelle est la meilleure maniere de l'afficher selon la langue du site? j'ai entendu parlé de sprintf, vprintf, ... mais je ne vois pas trop son utilité puisque je peux afficher ma date de cette maniere: Code :
$date_uk = $day." of ".$month.", ".$year; Merci |
|
|
00
|
|
|
#2 |
![]() ![]() Développeur Web Inscription : décembre 2006 Messages : 2 335 ![]() |
salut,
le mieux est peut être d'enregistrer le timestamp (qui est toujours indépendant du timezone), et en fonction du timezone affichée la date. Pour cel tu devras utiliser les classes DateTime et DateTimeZone qui existent dans PHP depuis la version 5.1.
__________________
Développeur | Zend Certified Engineer Étapes Pour mieux se servir du forum: 1. Commencez par lire les cours et tutoriels ; 2. Faites une recherche; 3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles; Nix>_Rien n'est plus pratique que la théorie |
|
|
00
|
|
|
#3 | |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
merci pour la reponse et aussi pour le lien. je le lis tout de suite!!
Citation:
la date en timestamp n'est il pas egal a strtotime("2010-11-16 11:13:35") ?? |
|
|
|
00
|
|
|
#4 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
et une petite precision: la fonction date_default_timezone_get() s'execute coté serveur?? il y a donc aucun moyen en php de savoir que monsieur X qui est à New York que son fuseau est 'America/New_York' ??
|
|
|
00
|
|
|
#5 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Salut
Comme tu parle d'achat de produits, donc de commerce en ligne, et bien quel intérêt il y a il de mettre la date de commande (facture) en fonction de la situation géographique du client ? L'achat s'est effectué sur ton site, c'est cette heure là qui fait plutôt référence, non ? En tout cas, quand je commande quelque chose en France Métropolitaine, la date de commande c'est celle de la France, pas celle de la Réunion où j'ai commandé. De même que tu évoque de mettre la date selon la langue. Là c'est pareil. Si c'est un Japonnais par exemple, vas tu mettre la date du Japon et dans cette langue aussi ? Ca risque d'être un peu compliqué je pense. Citation:
Tout ça s'apparente à la géolocalisation, je sais d'ailleurs que tu as déjà recourt à un de ces services. Faudrait voir par exemple ce que tu as dans ta Base de Données s'il y a moyen de rajouter par là un champs genre "timezone" pour les renseigner, ne serait ce qu'aux Pays par exemple.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
00
|
|
|
#6 | |||||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
Bonjour RunCodePhp, cava??
Citation:
Citation:
sur le site francais j'afficherai la date: 15 decembre 2010, en UK: december 15th 2010. pareil pour les prix, il y a un format pour la france, un autre pour le royaume uni et pour les USA (15.50 €, $15,00, ...) Citation:
Citation:
Citation:
|
|||||
|
|
00
|
|
|
#7 | ||||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Citation:
En quoi cela serait bizarre ? Tu n'a jamais commandé sur le Net ? Franchement, je n'est jamais vu une date de commande avec le fuseau horaire de la Réunion, là où je réside. L'inverse me surprendrait d'ailleurs, je m'attends plutôt que ça soit l'heure où se situe la boutique, c'est d'ailleurs de là où le colis partirait. Aussi, quand le client va payer, il va surement être redirigé vers une application externe d'une banque (ou genre PayPal, peu importe), et là aussi l'heure de la transaction ne sera pas celle de la Réunion, mais là où se situe la banque. Ou est le problème ? J'ai plutôt l'impression que ce ne serait pas une question de situation géographique, mais de la langue de l'interface, celle qu'aura choisi le client (utilisateur), ou celle proposée par défaut. Donc quelque part, le "timezone" serait lié à la langue, et non au Pays. Aussi, la plupart des sites Web e-commerce (du moins ceux que j'ai vu) évitent les traductions à ce niveau, ils indiquent plutôt des dates du genre 17/11/2010 15:43 ou alors 2010-11-17 15:43. Soit 2 formats de date basiques "passe partout", c'est bien plus simple, et surtout moins "casse gueule". Puis c'est un poil plus compliqué que ça, car concernant les traductions automatique au niveau des date en Php, théoriquement c'est lié au setlocale() (la fonction), mais pas au date_timezone_set() (un timezone). Le setlocal() étant lié au sytème (l'OS), il faut que le système intègre les langues qu'on souhaite manipuler, sinon c'est foutu. Enfin, foutu, dans le sens où il faudra le faire "à la mano". D'ailleurs, et en espérant ne pas dire une bêtise, mais concernant la classe DateTime, toutes les dates sont en Anglais, aucun moyen (aucune config coté Php) d'obtenir une date en Français par exemple, même avec un timezone du genre "Europe/Paris". Si on veut le faire avec cette classe DateTime, il faut créer une classe dérivée ensuite "à la mano", comme passer par des tableaux de remplacement de chaine par exemple. En finalité, le setlocale() + les fonctions de bases de Php reste le seul moyen d'avoir des date traduites automatiquement (sans sur-couche perso). Sauf erreur bien sûr. Citation:
Donc même le service est libre, tout le monde peu l'utiliser. D'ailleurs, je remarque qu'ils ont barrés la mention qui mettait une certaine limite de requête HTTP par jour. Il y aurait même plus de limite maintenant ... que demande le peuple Citation:
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||||
|
|
00
|
|
|
#8 | |||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
Citation:
Citation:
et franchement, tu me donnes LA solution. j'utiliserai donc un fuseau horaire par langue de site et non pas par pays d'utilisateur. j'ai 3 langues: fr-fr, en-us et en-gb, j'ai donc un fichier config.php dans chaque langue et j'y mettrai maintenant un date_default_timezone_set(). Pour la france ca sera Europe/Paris, UK -> Europe/London, mais quoi mettre pour les USA ? ils ont 3 ou 4 fuseaux differents?? Citation:
je reviens maintenant sur ma question au sujet de la fonction printf() quel est l'interet d'utiliser: Code :
printf ('%1$d of %2$s, %3$d', $day, $month, $year) MErci infiniment de votre aide |
|||
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Si on prend la réalité, comment sont fait les fuseaux horaires, ils n'ont déjà aucun rapport avec les langues, mais des pays. - La Belgique à 2 langues (Français et Flamand), ce n'est pas pour autant que les fuseaux diffèrent. - La France se trouve dans une petite partie à cheval sur 2 fuseaux horaires, ce n'est pas pour autant qu'il y en a 2, mais 1 seul pour des raisons pratiques, pour l'ensemble du pays. Se rajoute encore des raisons économiques (toujours lié au pays) qui débouche sur des heures été/hivers. Ton idée au départ qui est de lier ça au Pays reste à mon sens plus logique. La langue, la traduction de l'heure serait finalement un autre problème. Enfin, je te donne ma façon de voir. (je révise mon jugement en somme). Reste maintenant sur quoi, ou comment faire avec ces fuseaux horaires. Pas lier aux pays puisque certains pays ont plusieurs fuseaux horaires. Le problème c'est que je ne suis pas spécialiste des fuseaux horaires, sur quoi ils été défini. Est ce sur des villes ? Est ce sur des états, département, région, canton, ... ??? Personnellement j'en sais rien. Si on ne sait pas trop et si on ne veut pas prendre de risque, en liant les timezone aux villes ça va le faire je pense. Le gros problème c'est que stocker les villes du monde entier, ça va être chaud. Franchement, faudrait que tu réfléchisse si le jeu en vaut la chandelle, car ça me parait énorme pour un gain qui serait vraiment minime. Je doute d'ailleurs que la législation imposerait de mettre une date selon le fuseau horaire où se trouve le client. En plus, faut voir comment tu compte enregistrer cette info coté Bdd, de l'heure j'entends. Si par exemple tu enregistre l'heure des commandes comprenant le décalage horaire des utilisateur, ça veut dire que toutes les heures dans la Bdd n'auront pas du tout la même base/référence. Si un jour tu souhaite sortir une stat du genre : Toutes les commandes entre 10h00 et 11h00 heures de la boutique (ou serveur) ça va être rudement compliqué à mon avis. Ici, il vaudrait mieux utiliser une base commune comme l'heure UTC par exemple, et faire les conversions après coup, là où c'est nécessaire et selon le timezone. A la limite, commence par savoir comment tu vas faire pour obtenir le fuseau horaire de l'utilisateur, car c'est comme pour la géolocalisation sur IP (genre WIPmania). La manière de l'obtenir pourrait changer la donne, qui sait. Est ce que WIPmania renseigne le fuseau horaire d'ailleurs ? Si ce n'est pas le cas, faudrait voir si un tel service existe. Personnellement j'en sais rien, j'ai jamais recherché ça. Par contre, il est possible d'obtenir le nombre de d'heure de décalage horaire en Javascript avec la fonction getTimezoneOffset(). Citation:
C'est un peu compliqué à expliquer, car gettext() c'est déjà une manière particulière de gérer des contenus linguistiques, mais très intéressantes. Voir la doc Php : gettext() Si tu ne connais pas gettext() ou si ce n'est pas l'orientation que tu envisage, alors regarde les exemples de la fonction sprintf(), on peu faire des choses intéressantes sur les langues rien qu'avec celle ci.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||
|
|
00
|
|
|
#10 | |||||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
Citation:
ce qui peut arriver, c'est de vouloir afficher les commandes d'un jour J, et que certaines commandes soient passées apres minuit en france et avant minuit dans d'autres pays... mais d'autres part elle passera pour le jour suivant ou precedant et cette commande ne sera pas perdu! c'est un choix a faire, et je m'arrache vraiment les cheveux, je ne sais plus quoi faire!! je pense que ca devient vitre ingerable de vouloir gerer les fuseaux horaires par ville. je ne cherche pas a faire un site parfait a 100%, j'aimerais juste offrir un certain confort a l'utilisateur... une autre solution sera de mettre le fuseau horaire par default sur tout le site a GMT 00 puis lorsque j'affiche la date sur le site americain, ca sera November 12, 2010 GMT +06.00 encore une autre solution sera de demander a l'utilisateur de choisir son fuseau horaire lors de son inscription sur le site, et la ca fera une saisi suplementaire a l'internaute si c'est un champ obligatoire... Citation:
pour formater les prix, j'ai choisi cette methode. est la bonne et plus optimisée?? Code :
Citation:
je vois bien le fonctionnement de sprintf, mais je ne vois juste pas trop l'interet de l'utiliser puisque echo $day." of ".$month.", ".$year; peut faire l'affaire. il y a surement un detail qui m'échappe... |
|||||
|
|
00
|
|
|
#11 | ||||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Il faut mettre l'heure, et si tu mets l'heure GMT, ça sera obligatoirement +00.00 Il faut donc que l'heure comporte un décalage horaire pour qu'il y est un certain nombre au niveau du GMT. Donc soit c'est l'heure du client Américain : November 12, 2010 08:00 GMT -06.00 (soit 14h00 heure GMT) Ou soit c'est l'heure de ta boutique : 12 Novembre 2010 15h00 GMT +01.00 (soit 14h00 heure toujours) Si tu n'indique pas l'heure, c'est +6 heures, mais par rapport à quoi ? Citation:
Puis le confort que tu estime, j'en suis absolument pas convaincu. Si on est logique, un client qui passe commande sur ta boutique revient en quelque sorte qu'il se déplace sur ta boutique, du coup, il parait quasi évident que l'heure de la commande est celle de la boutique, pas celui de l'utilisateur. Je te conseils d'aller consulter des forums ou autre pour rechercher des infos sur ce point, car j'ai vraiment le sentiment que tu te mets une contrainte (ou confort) qui n'existerait même pas. A la limite, crée toi un banal champ supplémentaire dans la table commande (genre decalage_horaire), et tu mets le décalage horaire, comme +06.00 ou +0600 qui sont normalement les 2 standards. Sans rien de plus. Rien que ceci te permettras d'obtenir ce que tu veux, et surtout te laisser le temps d'y voir plus clair. Encore une fois, Javascript te permet de récupérer le décalage horaire qu'il y a sur le poste client, donc pas besoin de service externe pour ça. Citation:
Donc une personne qui au départ crée un compte client de chez lui, donc un fuseau horaire, aura la possibilité de commander ailleurs (lieu de vacance par exemple), autre pays, du coup autre fuseau horaire, mais voudra se faire livrer toujours à la même adresse. Dans ce cas là il y aura une incohérence entre le décalage horaire réel du navigateur et de l'adresse. De même que si le client commande de chez lui, mais souhaite faire livrer sur une autre adresse, autre fuseau horaire, là encore il y aura une incohérence. Donc lier un décalage horaire à une adresse ou compte client n'est forcément une bonne idée. Le décalage horaire serait (entre autre) lié à la commande à mon avis. Le récupérer lorsque le client cliquera sur "commander" me semble le plus simple et plus sûr, non ? Citation:
Je dirais qu'il faudrait faire gaffe à ton service de paiement en ligne, les caractères, langue, charset, encodage, etc ... peu avoir une certaine importance. Si cela ne perturbe rien à ce niveau, alors pourquoi pas.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||||
|
|
00
|
|
|
#12 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
apres une longue periode de reflexion, je pense que je vais ou bien negliger ce detail de decalage horaire. ou sinon au pire des cas, je crée un champ comme tu as dit qui contient ou bien le decalage horaire (-6, +2, ...) ou carement la date du client. qu'est ce que tu choisirais toi??
je reviens sur une question que j'ai posé en premier: quelle est la reelle difference entre Code :
printf ('%1$d of %2$s, %3$d', $day, $month, $year) qu'est ce qui m'echappe?? |
|
|
00
|
|
|
#13 | ||||||||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Mais au pire, comme j'ai dis précédemment, l'heure du serveur (boutique) et éventuellement un champ avec le décalage horaire genre +06:00 (d'un format standard). Il ne faut pas juste prévoir les heures, car il y a des endroits dans le monde où il y a des minutes aussi (des 1/2 heures, des 1/4 heures). Citation:
Regarde la fonction sprintf, les exemples que donne la doc : http://fr2.php.net/manual/fr/function.sprintf.php Entre autre ceci : La phrase à la base est : "Il y a 5 singes dans le bananier". Ca concerne 5 (pour %1$d) et bananier (pour %2$s) Code :
Code :
A titre d'exemple (et simple) Pour que ceci soit intéressant, il faut que l'on stock quelque part un format de date, mettons, un format de date pour une commande. Peu importe la manière dont sera stocké le format (xml, php, Bdd, etc ...). Admettons qu'on a 2 langues, Français et Anglais, il faudra alors 2 formats. Et bien on fera en sorte de stocker 2 formats du genre : Français : %1$d %2$s %3$d Anglais : %2$s of %1$d, %3$d Le but recherché : Français : 18 Novembre 2010 Anglais : November 18, 2010 Donc si un visiteur navigue en Anglais, on va va faire en sorte d'avoir une variable $format_date_commande qui aura comme valeur ici : %2$s of %1$d, %3$d Si c'est un visiteur qui navigue en Français, la valeur sera cette fois : %2$s of %1$d, %3$d. Cette variable sera initialisée avec le contenu qu'on aura récupéré (xml, php, Bdd, peu importe). Du coup, dans la page HTML qui génère la commande, la ligne de la date sera : Code :
printf ($format_date_commande, $day, $month, $year) C'est le fait d'obtenir qu'un seul code unique au bout qui fait que ça change pas mal, il n'y a pas l'ombre d'une alternative, tout est dynamique. Ton code réclamera normalement autant d'alternatives qu'il y a de langues/formats. Petite bémol dans cet exemple, car dans les 2 cas (Français ou Anglais) le mois November n'est pas traduit pour autant. On peu encore étendre le truc comme par exemple importer une liste de traductions mois, sous forme de tableau avec le même principe. Au bout : Code :
Je ne sais pas si mes explications sont bonnes, si tu vois le truc, je l'ai fait texto comme c'est venu.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||||||||
|
|
00
|
|
|
#14 |
![]() ![]() Inscription : septembre 2010 Messages : 6 967 ![]() |
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#15 | |||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
Citation:
au fait, j'avais deja vu toutes les explications concernant le sprintf mais je ne vois pas trop son utilité puisque j'ai pu formater mes dates en utilisant la methode suivante: Code :
j'ai par contre un petit soucis avec ce que j'ai fait, dans la mesure ou il va toujours me remplacer les numeros de mois par le mois (nov, oct, ...) comment pourrais je faire pour afficher une date du type 11/18/2010 ?? |
|||
|
|
00
|
|
|
#16 | |||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Mais le sprinf() ne s'impose pas, c'est juste une solution parmi tant d'autres, y compris IntlDateFormatter. Tu as choisi une voie différente, vouloir l'exploiter ne va peut être rien améliorer du tout. Citation:
Ne faudrait pas pas un autre format (autre constante) prévu pour ? Citation:
Le gros blême c'est quand on est sur un petit mutualisé, on a droit à rien du tout
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|||
|
|
00
|
|
|
#17 | |
![]() ![]() Inscription : septembre 2010 Messages : 6 967 ![]() |
Citation:
ps : et bientôt elle aura le Transliterator
__________________
http://blog.stealth35.com/ |
|
|
|
00
|
|
|
#18 | |||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
Citation:
je viens tout juste de me rendre compte que la methode que j'ai trouvé pour formater les prix ne marchera pas trop bien dans mon cas. je voulais par exemple mettre Code :
|
|||
|
|
00
|
|
|
#19 | ||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 757 ![]() |
bonsoir,
j'ai fait quelques ameliorations dans ma fonction qui formate les date que voici si ca peut interesser quelqu'un. RunCodePhp: tu as bien eu raison d'insister un peu sur la fonction sprintf. je viens de me rendre compte qu'elle presente bien plus d'avantages que la solution presentee précédemment!! Code :
|
||
|
|
00
|
|
|
#20 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Petite remarque au passage. Tu prévois de déclarer $sxml en global dans la fonction. Mais celle ci est tout aussi obligatoire que les 2 paramètre $format et $dt. Pourquoi donc ne pas le mettre aussi en paramètre ? D'une part, $sxml n'est pas modifié, juste exploité, puis quand bien même, apparemment $sxml serait un Objet, et depuis Php5, tout Objet "passe" par référence, donc ça ne change rien. D'ailleurs, ça peu se faire ainsi : Code :
show_date(MonObjet $sxml, $format, $dt) { ... etc ...} D'ailleurs, pour formater des prix Français/Anglais, tu pourrais adopter le même principe, car la position des symboles (€/$) cause à peu près le même problème. La solution est simple, et efficace. Attention tout de même au symbole Euro €, donc en entité HTML. C'est justement uniquement pour du HTML (donc spécifique), et si tu compte générer autre chose comme du XML, PDF, RTF, etc, etc ... ça peu être un inconvénient. Après ça, chacun sa manière de faire. Peut être est il trop tôt d'en parler, mais faire ce genre de chose de manière Objet (POO) se prête théoriquement bien mieux que des successions de fonctions. D'ailleurs, tu risque à force d'en avoir beaucoup. La POO permet de construire comme ça des Objets qui auront pour mission de gérer chaque cas. (date, prix, poids, client, produit, panier, commande, etc, etc ...)
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com