IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Se passer de getdate() et timestamp


Sujet :

Langage PHP

  1. #1
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut Se passer de getdate() et timestamp
    Salut

    Je voudrais avoir votre avis, ai-je réinventé la roue
    Existe t il une fonction native de PHP pouvant faire la même chose.
    Mon besoin, afficher une date sous forme littérale dans la fourchette 01/01/1900 à 31/12/2050.
    Pour la date du 13/04/1956, la date littérale est: vendredi 13 avril 1956 (sûr, c'est ma date de naissance).
    J'ai fait de multiples essais à l'aide de fonction native PHP, seulement apparemment on ne peut pas descendre en dessous du 1er janvier 1970.
    Donc je me suis fait une fonction que j'ai appeler DateLiteral, voici le code LiteralDate.php
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <!-- source internet -->
    <!-- le 01/01/1900 soit Lundi 1 Janvier 1900 -->
    <!-- le 01/01/2050 soit Samedi 1 Janvier 2050 -->
    <!-- d'années bissextiles depuis 1900 jusqu'à 2050 -->
    <!-- 1904, 1908, .. ==> .., 2044, 2048 (par intervalle de 4 ans) -->
     
    <!--Il y a un 29 février tous les 4 ans, et ce depuis 1582 et l'introduction du calendrier grégorien,
    on arrive au décompte de 106 « 29 février ».
    Cent six et non 109 car les années 1700, 1800 et 1900 n'ont pas été bissextiles
    (les années en ×000 ne sont bissextiles que si elles sont multiples de 400, comme l'an 2000)
     
    Depuis l'ajustement du calendrier grégorien (1582),
    l'année n'est bissextile (comportant 366 jours) que dans l'un des deux cas suivants:
    si l'année est divisible par 4 et non divisible par 100,
    si l'année est divisible par 400
    (« divisible » signifie que la division donne un nombre entier, sans reste).
    -->
    <?php
    //timestamp unix, impossible d'utiliser des dates précédant le 1er janvier 1970
    //***************************************************************************************************************************
    function DateLiteral($DateSoumise){
    	$NomJours = array(0 => "dimanche",1 => "lundi",2 => "mardi",3 => "mercredi",4 => "jeudi",5 => "vendredi",6 => "samedi");
    	$NomMois = array(1 => "janvier",2 => "février",3 => "mars",4 => "avril",5 => "mai",6 => "juin",
    					 7 => "juillet",8 => "aout",9 => "septembre",10 => "octobre",11 => "novembre",12 => "decembre");
    	list($JourNbr, $Mois, $Annee) = explode('/', $DateSoumise);
    	$JourNbr = intval($JourNbr); // convertir un chiffre < 10 (09 ==> 9)
    	$Mois = intval($Mois); // (03 ==> 3)
    	echo '<br>$JourNbr = '.$JourNbr.',$Mois = '.$Mois.',$Annee = '.$Annee;
    	$NbrJours = 0;
    	// ajout des jours pour les années entieres soumises (donc année soumise - 1)
    	for ($i = 1900; $i < $Annee; $i++) {
    		$NbrJours += ($i % 4 == 0 && $i % 100 <> 0) ? 366 : 365; // si la condition est vraie, année bissextile 366 jours, sinon 365
    	} 
    	// ajout des jours pour les mois entier (donc mois soumis - 1)
    	echo '<br>$NbrJours année(s) pleinne(s) = '.$NbrJours;
    	for ($i = 1; $i < $Mois; $i++) {
    		switch ($i)
    		{
    			case 2: // mois de février
    				$NbrJours += ($Annee % 4 == 0 && $Annee % 100 <> 0 && ($Mois-1) >= 3) ? 29 : 28; // si la condition est vraie, année bissextile
    				break;
    			case 1: //janvier
    			case 3: //mars
    			case 5: //mai
    			case 7: //juillet
    			case 8: //aout
    			case 10://octobre et ligne suivante decembre
    			case 12: $NbrJours += 31;break; 
    			default: $NbrJours += 30;break; //tous les autres mois
    		}
    	}
    	echo '<br>$NbrJours année(s) pleinne(s) et mois plein(s) = '.$NbrJours;
    	$NbrJours += $JourNbr; // ajout du nombre de jour du mois non entier de la date soumise
    	echo '<br>$NbrJours + $JourNbr, total jours: '.$NbrJours;
    	if ($JourNbr>=1 && $Mois>=3 && $Annee>=2000){$NbrJours += 1;}//01/03/2000 // <************ POURQUOI  ********** ????
    	$NbrSemaineInt = intdiv($NbrJours, 7);//Nombre de semaines entieres
    	echo '<br>$NbrSemaineInt = ' . $NbrSemaineInt;
    	$RestNbrj = $NbrJours - ($NbrSemaineInt * 7);//Nombre de jour en semaine non entiere
    	echo '<br>$RestNbrj = ' . $RestNbrj . '<br><br>';
    	return $NomJours[$RestNbrj] . " " . $JourNbr . " " . $NomMois[$Mois] . " " . $Annee;
    }//*********************************************************************************************************
    	if (isset($_POST['SoumissionDate']))
    	{	
    		$LaDate = $_POST['datesoumise'];
    		echo 'Pour la date du ' . $LaDate;
    		echo '<br />';
    		echo 'la date littérale est: ' . DateLiteral($LaDate);
    	}
    ?>
    Tous les echos dans la fonction sont provisoires, il ne m’ont servis que pour de-buguer.
    J'ai dût ajouter une condition (ligne 55) car j'avais une différence d'une journée à partie de cette date, je n'ai pas réussi à trouver pourquoi.
    Dans la réalité pour mon besoin, ce n'est pas l'utilisateur qui fournira la date, c'est pourquoi il n'y a aucune vérification de validité de la date fournis en paramètre.
    Pour faire fonctionner la fonction afin de vérifier le fonctionnement, le code EtudeDate.php
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!DOCTYPE html>
    <html lang="fr"> <!-- EtudeDate.php -->
    	<head>
    		<meta charset="UTF-8">
    		<meta name="viewport" content="width=device-width, initial-scale=1.0">
    		<title>Etude nom du jour</title>
    	</head>
    	<body>
    		<form method="POST" name="monform" action="LiteralDate.php" target="iframe_a">
    			<strong>Entrez votre date sous cette forme</strong>
    			<br />(01/01/1900 à 31/12/2050)
    			<br /><input type="text" name="datesoumise">
    			<input type="submit" name="SoumissionDate" value="Go" />
    		</form>
    		<br />
    		<iframe name="iframe_a" style="height:270px; width:400px;"> <!-- conteneur retour du traitement PHP-->
    		</iframe>	
    	</body>
    </html>
    Merci de vos éclaircissement.

    Motif de l'édit, correction de la ligne 55 $Annee>=2000 non pas $Annee>=200
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    au sujet du souci du 1er mars 2000, je crois que ça vient de votre calcul des années bissextiles. une année divisible par 100 n'est pas bissextile sauf si elle est divisible par 400.
    vous l'avez marqué dans vos commentaires mais le code ne calcule pas la division par 400.

  3. #3
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Salut
    Citation Envoyé par mathieu Voir le message
    ...
    vous l'avez marqué dans vos commentaires mais le code ne calcule pas la division par 400.
    Merci mathieu, c'est bien vue.
    La fonction corrigée donnant les bons résultats pour des dates de 01/01/1900 à au moins 31/12/2050
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
    function DateLiteral($DateSoumise){
    	$NomJours = array(0 => "dimanche",1 => "lundi",2 => "mardi",3 => "mercredi",4 => "jeudi",5 => "vendredi",6 => "samedi");
    	$NomMois = array(1 => "janvier",2 => "février",3 => "mars",4 => "avril",5 => "mai",6 => "juin",
    					 7 => "juillet",8 => "aout",9 => "septembre",10 => "octobre",11 => "novembre",12 => "décembre");
    	list($JourNbr, $Mois, $Annee) = explode('/', $DateSoumise);
    	$JourNbr = intval($JourNbr); // convertir un chiffre < 10 (09 ==> 9)
    	$Mois = intval($Mois); // (03 ==> 3)
    	$NbrJours = 0;
    	// ajout des jours pour les années entières soumises (donc année soumise - 1)
    	for ($i = 1900; $i < $Annee; $i++) {
    		$NbrJours += (($i%400==0)||($i%4==0&&$i%100<>0))?366:365; // si la condition est vraie, année bissextile 366 jours, sinon 365
    	} 
    	// ajout des jours pour les mois entier (donc mois soumis - 1)
    	for ($i = 1; $i < $Mois; $i++) {
    		switch ($i)
    		{
    			case 2: // mois de février
    				$NbrJours += (($Annee%400==0)||($Annee%4==0&&$Annee%100<>0))?29:28; // si la condition est vraie, année bissextile
    				break;
    			case 1: //janvier
    			case 3: //mars
    			case 5: //mai
    			case 7: //juillet
    			case 8: //aout
    			case 10://octobre et ligne suivante décembre
    			case 12: $NbrJours += 31;break; 
    			default: $NbrJours += 30;break; //tous les autres mois
    		}
    	}
    	$NbrJours += $JourNbr; // ajout du nombre de jour du mois non entier de la date soumise
    	$NbrSemaineInt = intdiv($NbrJours, 7);//Nombre de semaines entières
    	$RestNbrj = $NbrJours - ($NbrSemaineInt * 7);//Nombre de jour en semaine non entière
    	return $NomJours[$RestNbrj] . " " . $JourNbr . " " . $NomMois[$Mois] . " " . $Annee;
    }
    ?>
    Donc résolu, mais ..... existe t il une fonction PHP native ou plus simple que mon bout de code?
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    existe t il une fonction PHP native ou plus simple que mon bout de code?
    ah oui c'était ça la question initiale, et ma réponse est : oui vous avez réinventé la roue il est possible de faire la même chose avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    setlocale(LC_ALL, "fr_FR.UTF-8"); // pour que strftime affiche les noms des mois et des jours en français, cela ne change rien au fuseau horaire
    $timestamp = mktime($heures, $minutes, $secondes, $Mois, $JourNbr, $Annee);
    echo strftime("%A %d %B %G", $timestamp);
    le soucis de ce code est expliqué dans la documentation, suivant le système d'exploitation, les dates avant 1970 ne sont pas gérées :
    https://www.php.net/manual/fr/function.strftime.php

    mon ordinateur sous linux gère les timestamp négatifs donc j'ai pu comparer votre code avec le résultat de "strftime" et votre code fonctionne à partir de 1600 si vous commence la boucle de années entières à 1596 au lieu de 1900.

    en ce qui concerne la limite haute, la documentation indique que sur les systèmes 32 bits, les dates sont gérées de 1901 à 2038. alors qu'avec votre code, j'ai testé des dates autour de l'an 3000 et ça a l'air bon avec une vitesse comparable à "strftime".

  5. #5
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,

    Vous pouvez passer par IntlDateFormatter https://www.php.net/manual/fr/intlda...ter.format.php
    Un exemple ici https://3v4l.org/FVXen
    Le bienfait n'est jamais perdu

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Citation Envoyé par mathieu Voir le message
    .../...

    en ce qui concerne la limite haute, la documentation indique que sur les systèmes 32 bits, les dates sont gérées de 1901 à 2038. alors qu'avec votre code, j'ai testé des dates autour de l'an 3000 et ça a l'air bon avec une vitesse comparable à "strftime".
    Bonjour,

    Mathieu, ah oui depuis l'autre fois je me posais cette question : "Étant sous Vista 32, il est donc normal que mktime se limite à l'année 2038 ?"

    Me confirmes-tu cela ?

    Autrement dit, sur ton système 64 bits, tu peux aller au delà ?

    DS7

  7. #7
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    mathieu, Willy_k, merci à vous deux pour toutes ses précisions.
    J'avais recherché sur le site https://www.php.net/manual, mais pas trouvé les bons mots, donc je suis passé à coté.
    Un gros merci, encor un plus pour ma satisfaction personnelle d'apprentissage.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passer de Vb Date à Unix TimeStamp
    Par hwarangouze dans le forum VBScript
    Réponses: 2
    Dernier message: 02/08/2012, 09h50
  2. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  3. pk passer de mysql à postgre
    Par pioums dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 03/10/2002, 10h31
  4. Passer du Pascal à Delphi
    Par poppels dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2002, 21h07
  5. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/05/2002, 23h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo