2010-07-23 16 views
15

¿Dime cómo puedo obtener el último número de semanas en un año?PHP - obtenga el número de la semana pasada en el año

+1

Lo EXAC ¿A qué te refieres con eso? Por favor sé más específico. –

+5

@Andy E: No necesariamente ... el número de la última semana podría ser 53. La definición ISO-8601 de la semana 01 es la semana del primer jueves. – Powerlord

+1

Tuve un ejemplo en mi comentario anterior, pero creo que fue incorrecto, así que lo eliminé. Para resumir: desde 52 semanas son 364 días, y un año es 365-366 días, cada pocos años terminas con una semana extra. – Powerlord

Respuesta

14

Sustituir 2010 por el año que desee y Europa/Berlín, con su zona horaria:

<?php 
    date_default_timezone_set('Europe/Berlin'); 
    echo gmdate("W", strtotime("31 December 2010")); 
?> 

Usted obtendrá uno de los valores 01, 52 o 53.


Sólo por diversión (Demo):

<?php 
    date_default_timezone_set('Europe/Berlin'); 
    echo "ISO-8601 week number of year, weeks starting on Monday, of 31 December:\n\n"; 
    for ($year = 1900; $year < 2100; $year++) { 
     $date = strtotime("31 December $year"); 
     echo "$year => ", gmdate("W", $date), "\n"; 
    } 
?> 

Salida:

ISO-8601 week number of year, weeks starting on Monday, of 31 December: 

1900 => 01 
1901 => 01 
1902 => 01 
1903 => 53 
1904 => 52 
1905 => 52 
1906 => 52 
1907 => 01 
1908 => 53 
1909 => 52 
1910 => 52 
1911 => 52 
1912 => 01 
1913 => 01 
1914 => 53 
1915 => 52 
1916 => 52 
1917 => 52 
1918 => 01 
1919 => 01 
1920 => 53 
1921 => 52 
1922 => 52 
1923 => 52 
1924 => 01 
1925 => 53 
1926 => 52 
1927 => 52 
1928 => 52 
1929 => 01 
1930 => 01 
1931 => 53 
1932 => 52 
1933 => 52 
1934 => 52 
1935 => 01 
1936 => 53 
1937 => 52 
1938 => 52 
1939 => 52 
1940 => 01 
1941 => 01 
1942 => 53 
1943 => 52 
1944 => 52 
1945 => 52 
1946 => 01 
1947 => 01 
1948 => 53 
1949 => 52 
1950 => 52 
1951 => 52 
1952 => 01 
1953 => 53 
1954 => 52 
1955 => 52 
1956 => 52 
1957 => 01 
1958 => 01 
1959 => 53 
1960 => 52 
1961 => 52 
1962 => 52 
1963 => 01 
1964 => 53 
1965 => 52 
1966 => 52 
1967 => 52 
1968 => 01 
1969 => 01 
1970 => 53 
1971 => 52 
1972 => 52 
1973 => 52 
1974 => 01 
1975 => 01 
1976 => 53 
1977 => 52 
1978 => 52 
1979 => 52 
1980 => 01 
1981 => 53 
1982 => 52 
1983 => 52 
1984 => 52 
1985 => 01 
1986 => 01 
1987 => 53 
1988 => 52 
1989 => 52 
1990 => 52 
1991 => 01 
1992 => 53 
1993 => 52 
1994 => 52 
1995 => 52 
1996 => 01 
1997 => 01 
1998 => 53 
1999 => 52 
2000 => 52 
2001 => 52 
2002 => 01 
2003 => 01 
2004 => 53 
2005 => 52 
2006 => 52 
2007 => 52 
2008 => 01 
2009 => 53 
2010 => 52 
2011 => 52 
2012 => 52 
2013 => 01 
2014 => 01 
2015 => 53 
2016 => 52 
2017 => 52 
2018 => 52 
2019 => 01 
2020 => 53 
2021 => 52 
2022 => 52 
2023 => 52 
2024 => 01 
2025 => 01 
2026 => 53 
2027 => 52 
2028 => 52 
2029 => 52 
2030 => 01 
2031 => 01 
2032 => 53 
2033 => 52 
2034 => 52 
2035 => 52 
2036 => 01 
2037 => 53 
2038 => 01 
2039 => 01 
2040 => 01 
2041 => 01 
2042 => 01 
2043 => 01 
2044 => 01 
2045 => 01 
2046 => 01 
2047 => 01 
2048 => 01 
2049 => 01 
2050 => 01 
2051 => 01 
2052 => 01 
2053 => 01 
2054 => 01 
2055 => 01 
2056 => 01 
2057 => 01 
2058 => 01 
2059 => 01 
2060 => 01 
2061 => 01 
2062 => 01 
2063 => 01 
2064 => 01 
2065 => 01 
2066 => 01 
2067 => 01 
2068 => 01 
2069 => 01 
2070 => 01 
2071 => 01 
2072 => 01 
2073 => 01 
2074 => 01 
2075 => 01 
2076 => 01 
2077 => 01 
2078 => 01 
2079 => 01 
2080 => 01 
2081 => 01 
2082 => 01 
2083 => 01 
2084 => 01 
2085 => 01 
2086 => 01 
2087 => 01 
2088 => 01 
2089 => 01 
2090 => 01 
2091 => 01 
2092 => 01 
2093 => 01 
2094 => 01 
2095 => 01 
2096 => 01 
2097 => 01 
2098 => 01 
2099 => 01 
1

Si se preguntaban cómo obtener el número de semanas que termine el año, esto lo haría :

<?php 

$year = date('Y'); 

$week_count = date('W', strtotime($year . '-12-31')); 

if ($week_count == '01') 
{ 
    $week_count = date('W', strtotime($year . '-12-24')); 
} 

echo ($week_count - date('W')); 
echo ' weeks left in ' . date('Y') . '!'; 

?> 

Editar: Se agregó lógica para compensar el '01' devuelto por la fecha ('W');

+0

Eso podría no dar un resultado esperado, porque como se indica en los comentarios de la pregunta, la última semana puede ser '01'. En tal caso, su código arrojaría un número negativo de semanas en el año. Debería convertir programáticamente el caso marginal '01' (agregando 1 a la penúltima semana). –

+0

@paul Acabo de editar el código, bastante seguro de que compensaría correctamente el '01' devuelto ...pensándolo bien, todavía se caería cuando la semana actual vuelve a 01 también ... tan cerca;) – joshtronic

+0

Es algo parecido a eso. :) –

36
function getIsoWeeksInYear($year) { 
    $date = new DateTime; 
    $date->setISODate($year, 53); 
    return ($date->format("W") === "53" ? 53 : 52); 
} 

El formato de fecha o da el año númeroISO-8601. Podemos usar esto y el hecho de que las fechas "no válidas" se vuelven automáticamente para hacer las válidas (2011-02-31 da 2011-03-03), para determinar si un año determinado tiene 53 semanas. Si no es así, debe tener 52.

Consulte también, date format characters y DateTime::setISODate() páginas de manual.

+3

agradable y simple – Gordon

20

En ISO-8601 especificación, dice que 28 de diciembre es siempre en la última semana de su año.
Basado en eso, puede crear simplemente esa fecha, y ver en qué semana es:

$dt = new DateTime('December 28th'); 
echo $dt->format('W'); # 52 

$dt = new DateTime('December 28th, 2009'); 
echo $dt->format('W'); # 53 

demo

... o si está utilizando date() y strtotime() funciones: echo date('W', strtotime('December 28th')); # 52

-1
echo getLastWeekOfYear(2015); 

function getLastWeekOfYear($year) { 
    $date = new DateTime(); 
    return date('W', strtotime(date('Y-m-d', strtotime($date->setISODate($year, 1, "1")->format('Y-m-d') . "-1day")))); 
} 
Cuestiones relacionadas