Unix time converter (utc)

5/5 (14 avis)

Snippet vu 10 805 fois - Téléchargée 16 fois

Contenu du snippet

Classe permettant de convertir une date au format Unix (nombre de secondes écoulées depuis le 1er Janvier 1970 jusqu'au moment x).

Par exemple 1217236577 deviendra 2008-07-26 09:16:17.

Il s'agit de ma première source, j'espère qu'elle n'est pas trop brouillon.

Source / Exemple :


<?php

class dateUTC {

	//
	// Tiger-222 - le 24 Juillet 2008 - révision le 03 Août 2008
	//
	// Classe qui convertit la date au format Unix vers AAAA-MM-JJ hh:mm:ss
	//
	// Exemple : 1217236577 deviendra 2008-07-26 09:16:17
	//

	public function __construct($dateUnix) {
		$this->afficher($dateUnix);
	}

	//
	// Fonction qui retourne la partie entière du nombre passé en paramètre.
	//
	// Prend 1 argument.
	//
	private function entier($nombre) {
		if ($nombre < 1) {
			return 0;
		}
		else {
			$nombreAvant = explode('.', $nombre);
			return $nombreAvant['0'];
		}
	}

	//
	// Fonction de conversion.
	//
	// Prend 1 argument.
	//
	private function convertir($dateUnix) {
		//
		// La fonction entier() indiquera le nombre entier d'unités de temps.
		//
		// Principe :
		//  La plus grande unité de temps invariable est le jour ; les mois
		//  (28, 29, 30 ou 31 jours) et les années (365 ou 366) sont variables.
		//  La première étape consiste à décompter le nombre de périodes
		//  quadriennales bisextiles.
		//
		// 	La date au format Unix étant le nombre de secondes depuis
		// 	le 1er Janvier 1970, et la première année bisextile étant
		// 	1972, nous calculons le nombre de secondes entre
		// 	le 01/01/1970 et le 29/02/1972.
		//

		//
		// Définitions des variables :
		//
		$vingtSixMois = 60 * 60 * 24 * 790;
		$quatreAns = 126230400;
		$unAn = 31536000;
		$unJour = 86400;

		if ($dateUnix > $vingtSixMois) {
			// ########################################################
			// 1er calcul : le nombre de périodes quadriennales bisextiles.
			//
			$tranche = $this->entier(($dateUnix - $vingtSixMois) / $quatreAns);

			//
			// Calcul des secondes restantes :
			//
			$reste = $dateUnix - $vingtSixMois - ($quatreAns * $tranche);
		}
		else {
			$reste = $dateUnix;
		}

		// ########################################################
		/ 2ème calcul : le nombre d'années.
		//
		$nbAnnee = $this->entier($reste / $unAn);

		//
		// Calcul des secondes restantes :
		//
		$reste = $reste - ($nbAnnee * $unAn);

		// ########################################################
		// 3ème calcul : nombre de jours.
		//
		$nbJours = $this->entier($reste / $unJour);
		$jours = $nbJours + 1;

		//
		// Nombre de jours par mois.
		//
		if ($dateUnix <= $vingtSixMois) {
			$Mois[0] = 31;				// Janvier
			if ($nbAnnee == 2)
				$Mois[1] = 29;			// Février
			else
				$Mois[1] = 28;			// Février
			$Mois[2] = 31;				// Mars
			$Mois[3] = 30;				// Avril
			$Mois[4] = 31;				// Mai
			$Mois[5] = 30;				// Juin
			$Mois[6] = 31;				// Juillet
			$Mois[7] = 31;				// Août
			$Mois[8] = 30;				// Septembre
			$Mois[9] = 31;				// Octobre
			$Mois[10] = 30;				// Novembre
			$Mois[11] = 31;				// Décembre

			/*

  • Numéro du mois.
  • /
$MoisN[0] = '01'; // Janvier $MoisN[1] = '02'; // Février $MoisN[2] = '03'; // Mars $MoisN[3] = '04'; // Avril $MoisN[4] = '05'; // Mai $MoisN[5] = '06'; // Juin $MoisN[6] = '07'; // Juillet $MoisN[7] = '08'; // Août $MoisN[8] = '09'; // Septembre $MoisN[9] = '10'; // Octobre $MoisN[10] = '11'; // Novembre $MoisN[11] = '12'; // Décembre } else { $Mois[0] = 31; // Mars $Mois[1] = 30; // Avril $Mois[2] = 31; // Mai $Mois[3] = 30; // Juin $Mois[4] = 31; // Juillet $Mois[5] = 31; // Août $Mois[6] = 30; // Septembre $Mois[7] = 31; // Octobre $Mois[8] = 30; // Novembre $Mois[9] = 31; // Décembre $Mois[10] = 31; // Janvier $Mois[11] = 28; // Février /*
  • Numéro du mois.
  • /
$MoisN[0] = '03'; // Mars $MoisN[1] = '04'; // Avril $MoisN[2] = '05'; // Mai $MoisN[3] = '06'; // Juin $MoisN[4] = '07'; // Juillet $MoisN[5] = '08'; // Août $MoisN[6] = '09'; // Septembre $MoisN[7] = '10'; // Octobre $MoisN[8] = '11'; // Novembre $MoisN[9] = '12'; // Décembre $MoisN[10] = '01'; // Janvier $MoisN[11] = '02'; // Février } // // Détermination du numéro du mois en cours. // $max = count($Mois); for ($i = 0; $i < $max; ++$i) { if ($jours > $Mois[$i]) { $jours = $jours - $Mois[$i]; } elseif ($jours == $Mois[$i]) { $mois = $MoisN[$i]; $i = $max; } else { $mois = $MoisN[$i]; $i = $max; } } if ($jours < 10) { $jours = '0'.$jours; } // // Détermination de l'année. // if ($dateUnix > $vingtSixMois) { if ($nbJours <= 306) { if ($tranche < 1) { $annee = 1972 + $nbAnnee; } else { $annee = ($tranche * 4) + $nbAnnee + 1972; } } else { if ($tranche < 1) { $annee = 1972 + 1 + $nbAnnee; } else { $annee = ($tranche * 4) + $nbAnnee + 1972 + 1; } } } else { $annee = 1970 + $nbAnnee; } // // Calcul des secondes restantes : // $reste = $reste - ($nbJours * $unJour); // ######################################################## // 4ème calcul : nombre d'heures. // $heures = $this->entier($reste / 3600); if ($heures < 10) $heures = '0'.$heures; // // Calcul des secondes restantes : // $reste = $reste - ($heures * 3600); // ######################################################## // 5ème calcul : nombre de minutes. // $minutes = $this->entier($reste / 60); if ($minutes < 10) $minutes = '0'.$minutes; // // Calcul des secondes restantes : // $secondes = $reste - ($minutes * 60); if ($secondes < 10) $secondes = '0'.$secondes; // ######################################################## // Formatage de la date. // $finale = $annee.'-'.$mois.'-'.$jours.' '.$heures.':'.$minutes.':'.$secondes; echo $finale; } public function afficher($dateUnix) { $this->convertir($dateUnix); } } // Appeler la classe tel que : // $test = new dateUTC(1217236577); ?>

Conclusion :


N'hésitez pas à critiquer !

... et bonne conversion !

A voir également

Ajouter un commentaire

Commentaires

PhilLU
Messages postés
248
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
-
Salut,
Puisque vous semblez bien informé au sujet des conversions de dates, j'ai une question à vous soumettre:
Je dois convertir un TimeStamp en date hh mm ss mais je n'arrive pas à savoir comment est construit ce TimeStamp!
exemple: 3375177394 qui devrait correspondre à environ 14/12/2010 à 18h10
J'ai essayé pas mal de chose mais sans résultat!
Qui peut m'aider?

Merci d'avance,
PhilLu
tiger222
Messages postés
13
Date d'inscription
lundi 23 juin 2003
Statut
Membre
Dernière intervention
27 septembre 2008
-
@yoman64 : tu as tout a fait raison sur le fait que je n'aurai peut être pas du poster cette source. La prochaine fois je ferai plus attention ;)

@yopai_v : merci beaucoup pour cette analyse et ces explications !
yopai_v
Messages postés
48
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010
-
Juste quelques petites remarques pour enfoncer un peu le clou avec mon grain de sel.

Concernant l'appel à date() :
- depuis PHP 5.1, penser à appeler date_default_timezone_set() (ou à positionner la variable d'env. TZ) dans l'initialisation du script
- dans l'écriture date('Y-m-d H:i:s', time())" lue dans le commentaire de bentom32390
- d'une part, ça ne correspond pas au but de la source (qui est de convertir un timestamp donné)
- d'autre part le 2e paramètre est inutile dans ce cas-là (c'est la valeur par défaut du paramètre)

Concernant le code :
- je rejoins tout le monde : lire la doc et parcourir les classes Pear devrait te donner un aperçu correct de ce qui existe et qu'il n'y a pas besoin de redévelopper.
- du coup, j'ai l'impression que personne n'a regardé ta source en détail. Je vais donc t'indiquer ce qui, d'après-moi, est mal écrit dans ton code.
Ce qui me choque en première lecture, c'est que tu as programmé une librairie de fonctions, pas une classe. De 2 choses l'une :
* soit une instance de ta classe représente une date unique. Alors les différentes méthodes (afficher, convertir)n'ont pas besoin de paramètre, et doivent se baser sur les propriétés de ton objet (initialisées par le constructeur)
A l'appel :
date1 = new dateUTC(12345678)
date1->afficher();
date2 = new dateUTC(987654321)
date2->afficher();

* soit ta classe gère toutes les dates. Alors le constructeur ne prend pas de paramètres, et les méthodes afficher et convertir peuvent être des méthodes statiques
dateHandler::afficher(12345678);
dateHandler::afficher(987654321);
ta classe peut aussi être un singleton (cherche sur Google), ce qui donnerait à l'appel :
dateHandler = dateUTCHandler::getInstance();
dateHandler->afficher(12345678);
dateHandler->afficher(12345678);

Ensuite, la méthode "convertir" est inutile. Elle porte d'ailleurs mal son nom, puisqu'elle génère un affichage (ce qui devrait être le rôle d'"afficher").
Je serais toi, c'est donc convertir() qui devrait faire tout le travail, mais *retourner* (return) la valeur; le corps d'afficher() serait alors { echo $this->convertir(...); }

Enfin, ta méthode est beaucoup trop écrite de manière itérative.
N'hésite pas à découper ton algorithme en sous-méthodes :
- tu y gagneras en lisibilité
- cela permettra de surcharger facilement ta classe

Une dernière chose, prend l'habitude de toujours mettre les accolades pour un if.
Le jour où tu écriras :
if (je_suis_sur_de vouloir_formater)
format;

et que machinalement, tu ajouteras une ligne de debug :
if (je_suis_sur_de vouloir_formater)
log("formatage");
format;

tu regretteras de ne pas les avoir mises !
cs_yoman64
Messages postés
592
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
4 décembre 2008
-
Salut,

Je reprends l'avis des autres, pourquoi avoir fait une classe alors que php dispose en natif d'une bonne dizaine de fonctions pour manipuler les dates et timestamps qui sont évidement beaucoup plus rapides ?

Mis à part que ta classe permet sans doute aux débutants de comprendre un peu mieux ce qu'est un timestamp (dans ce cas ce serait plus un tutoriel qu'une source), je ne vois vraiment pas ce que cela apporte à la communauté de phpcs.

Ne prends pas ça pour des critiques personnelles, je m'interroge seulement sur l'intérêt d'un tel code pour phpcs, parce qu'après tout c'est bien que tu apprennes en faisant ce genre d'exercices, mais pas besoin de tout poster ce qu'on fait ^^ (au moins ce n'est pas un convertisseur d'euros, je te l'accore :P)
tiger222
Messages postés
13
Date d'inscription
lundi 23 juin 2003
Statut
Membre
Dernière intervention
27 septembre 2008
-
Cette classe n'est pas là pour réinventer la manipulation de format de date.

En fait, cette classe me permet de convertir les dates d'inscription des utilisateurs d'un Simple Machines Forum vers WordPress car j'écrit un module de conversion des utilisateurs de l'un à l'autre.

Mais c'est vrai qu'elle n'est pas à utiliser ailleurs puisqu'il existe déjà tout ce qu'il faut.
C'est plutôt un exercice intéressant pour ma part.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.