2010-09-18 13 views
14

Je récupère une entrée d'une base de données avec une date associée.PHP: Comment obtenir le dimanche précédent d'une date spécifique dans le passé ..?

Je veux être en mesure d'obtenir le dimanche précédent et le samedi suivant relativement à cette date spécifique pour remplir un quantième jQuery.

Je sais comment faire avec le temps/date réelle avec:

strtotime('last Sunday') 

, mais je ne sais pas comment faire pour une autre date que maintenant ...

Merci.

Répondre

42

Utilisez le deuxième argument de strtotime de préciser la date de calcul "dimanche dernier" et d'autres dates relatives de:

strtotime('last Sunday', strtotime('09/01/2010')); 

http://us2.php.net/strtotime

Exemple:

echo date('m/d/Y', strtotime('last Sunday', strtotime('09/01/2010'))); 

Sortie:

08/29/2010 
+0

Fonctionne très bien.! Merci. – pnichols

+3

pas besoin d'appeler [strtotime] (http://php.net/manual/fr/function.strtotime.php) deux fois, cela peut être fait comme 'echo date ('m/d/Y', strtotime (" dernier dimanche 09/01/2010 "));' –

17

Vous pouvez également utiliser la classe datetime pour cela. Le code ci-dessous fonctionnerait:

 
$date = new DateTime('09/01/2010'); 
$date->modify('last Sunday'); 
echo $date->format('d/m/Y'); 
Output: 29/08/2010 

Jetez un oeil à http://ca2.php.net/manual/en/class.datetime.php. Le constructeur prend deux arguments optionnels, dont le premier est une chaîne de date pour l'objet (par défaut) et le second est un objet DateTimeZone (par défaut le fuseau horaire défini dans PHP.ini). La méthode modify modifie ensuite la date en utilisant les mêmes expressions que strtotime() et la méthode de format formate la date en utilisant les mêmes chaînes de format que date(). Fondamentalement, cela fait la même chose que l'exemple de pygorex1 mais en utilisant la syntaxe orientée objet.

+0

Notez que cela nécessite PHP 5.3. – alexn

+0

@alexn Ce n'est pas vrai. La classe datetime est disponible à partir de PHP 5.2. Il y a des méthodes supplémentaires disponibles en PHP 5.3 (je pense à l'add and sub) mais toutes les méthodes que j'ai utilisées dans mon exemple sont disponibles en PHP 5.2.x. – Jeremy

+0

Intéressant ... Je dois vraiment commencer à regarder dans OO. Je sais que c'est un must pour rester à jour, mais OO semble être trop/inutile pour le type/la taille du projet que j'ai ... – pnichols

0

Vous pouvez utiliser le décalage du jour de la semaine. En PHP date arbitraire:

<?php 

define('SEC_IN_DAY', (24*60*60)); 

$d = strtotime('2013-04-15'); 
// "w" is the day of the week. 0 for Sunday through 6 for Saturday 
$delta_sun = -date('w', $d); 
$delta_sat = $delta_sun + 6; 

echo 'The day ' . date('Y-m-d H:i:s', $d) . "\n"; 
echo 'Last Sunday '. date('Y-m-d H:i:s', $d + $delta_sun * SEC_IN_DAY) . "\n"; 
echo 'Next Saturday '. date('Y-m-d H:i:s', $d + $delta_sat * SEC_IN_DAY) . "\n"; 

Le même MySQL:

SET @d := '2013-04-15'; 
SET @delta_sun := -DATE_FORMAT(@d, '%w'); 
SET @delta_sat := @delta_sun + 6; 

SELECT 'The day' AS `name`, DATE(@d) AS `date` 
    UNION ALL 
SELECT 'Last Sunday' AS `name`, DATE_ADD(@d, INTERVAL @delta_sun DAY) AS `date` 
    UNION ALL 
SELECT 'Next Saturday' AS `name`, DATE_ADD(@d, INTERVAL @delta_sat DAY) AS `date` 
+0

La constante SEC_IN_DAY est probablement un peu inutile. '86400' est un nombre assez communément utilisé et connu en PHP, vous pouvez l'utiliser directement. – crmpicco