2010-09-18 8 views

Respuesta

42

Utilice el segundo argumento de strtotime para especificar la fecha para calcular "el domingo pasado" y otras fechas relativas a partir de:

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

http://us2.php.net/strtotime

Ejemplo:

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

Salida:

08/29/2010 
+0

funciona muy bien.! Gracias. – pnichols

+3

sin necesidad de llamar a [strtotime] (http://php.net/manual/en/function.strtotime.php) dos veces, se puede hacer como 'echo date ('m/d/Y', strtotime (" last domingo 01/09/2010 "));' –

17

También puede usar la clase datetime para hacer esto. El código siguiente funcionaría:

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

Tenga una mirada en http://ca2.php.net/manual/en/class.datetime.php. El constructor toma dos argumentos opcionales, el primero de los cuales es una cadena de fecha para el objeto (predeterminado hasta ahora) y el segundo es un objeto DateTimeZone (por defecto es la zona horaria configurada en PHP.ini). El método de modificación luego altera la fecha usando las mismas expresiones que admite strtotime() y el método de formato formatea la fecha usando las mismas cadenas de formato que date(). Básicamente, esto hace lo mismo que el ejemplo de pygorex1 pero usando sintaxis orientada a objetos.

+0

Tenga en cuenta que esto requiere PHP 5.3. – alexn

+0

@alexn Eso no es verdad. La clase datetime está disponible desde PHP 5.2 en adelante. Hay algunos métodos adicionales disponibles en PHP 5.3 (agregar y sub venir a la mente) pero todos los métodos que utilicé en mi ejemplo están disponibles en PHP 5.2.x. – Jeremy

+0

Interesante ... Realmente tengo que empezar a buscar en OO. Sé que es necesario estar actualizado, pero OO parece ser demasiado/innecesario para el tipo/tamaño del proyecto que tengo ... – pnichols

0

Puede usar la compensación de días laborables. En PHP para la fecha arbitraria:

<?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"; 

Lo mismo en 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' es probablemente un poco inútil. '86400' es un número bastante utilizado y conocido en PHP, puedes usarlo directamente. – crmpicco

Cuestiones relacionadas