semana - obtener primer y ultimo dia del mes php
PHP obtiene la fecha de inicio y finalización de una semana por número de semana (11)
He visto algunas variantes de esta pregunta, pero creo que esta aún no ha sido respondida.
Necesito obtener la fecha de inicio y finalización de una semana, elegida por año y número de semana (no una fecha)
ejemplo:
entrada:
getStartAndEndDate($week, $year);
salida:
$return[0] = $firstDay;
$return[1] = $lastDay;
El valor de retorno será algo así como una matriz en la que la primera entrada es la fecha de inicio de la semana y la segunda es la fecha de finalización.
OPCIONAL: mientras estamos en ello, el formato de fecha debe ser Ynj
(formato de fecha normal, sin ceros a la izquierda).
Intenté editar las funciones existentes que casi hicieron lo que quería pero hasta ahora no he tenido suerte.
Por favor, ayúdenme, gracias de antemano.
¿Has probado las fechas relativas de PHP ? Podría funcionar.
El cálculo de Roham Rafii es incorrecto. Aquí hay una breve solución:
// week number to timestamp (first day of week number)
function wn2ts($week, $year) {
return strtotime(sprintf(''%dW%02d'', $year, $week));
}
si quiere el número del último día de la semana, puede sumar 6 * 24 * 3600
Esta es una pregunta antigua, pero muchas de las respuestas publicadas anteriormente parecen ser incorrectas. Se me ocurrió mi propia solución:
function getStartAndEndDate($week, $year){
$dates[0] = date("Y-m-d", strtotime($year.''W''.str_pad($week, 2, 0, STR_PAD_LEFT)));
$dates[1] = date("Y-m-d", strtotime($year.''W''.str_pad($week, 2, 0, STR_PAD_LEFT).'' +6 days''));
return $dates;
}
Incluso si no quieres usar una fecha específica, no puedes escapar de ella. Puede calcular una semana basada SOLAMENTE en la fecha.
Pasos:
- obtener el primer día del año
- Decida cuándo comienza la primera semana (hay algunas reglas que incluyen el primer jueves, si no recuerdo mal).
- agregue algunas semanas (su primer param). Zend_Date tiene una función add () donde puede agregar semanas, por ejemplo. Esto te dará el primer día de la semana.
- compensar y obtener el último día.
Recomendaría trabajar con un sistema de fechas coherente como Zend_Date o Pear Date .
Podemos lograr esto fácilmente sin la necesidad de cálculos adicionales además de los inherentes a la clase DateTime .
function getStartAndEndDate($year, $week)
{
return [
(new DateTime())->setISODate($year, $week)->format(''Y-m-d''), //start date
(new DateTime())->setISODate($year, $week, 7)->format(''Y-m-d'') //end date
];
}
La función setISODate()
toma tres argumentos: $year
, $week
y $day
respectivamente, donde $day
defecto en 1 - el primer día de la semana. Por lo tanto, pasamos 7 para obtener la fecha exacta del séptimo día de la $week
.
Primero necesitamos un día a partir de esa semana, de modo que al conocer el número de la semana y sabiendo que una semana tiene siete días vamos a hacerlo,
$pickADay = ($weekNo-1) * 7 + 3;
de esta manera pickAday será un día en nuestra semana deseada.
Ahora que sabemos el año, podemos verificar qué día es ese. las cosas son simples si solo necesitamos fechas más nuevas que la marca de tiempo de Unix Obtendremos la marca de tiempo de UNIX para el primer día del año y agregaremos 24*3600*$pickADay
y todo es simple a partir de aquí porque tenemos su marca de tiempo, podemos saber qué día de la semana y calcule la cabeza y la cola de esa semana en consecuencia.
Si queremos descubrir lo mismo de, digamos, la 12ª semana de 1848, debemos usar otro enfoque, ya que no podemos obtener la marca de tiempo. Sabiendo que cada año un día avanza el significado de 1 semana (el 1 de noviembre del año pasado fue un domingo, este año es un lunes, excepción para los años bisiestos cuando avanza 2 días, creo que puede verificar eso). Qué haría si el año es anterior a 1970 que hacer una diferencia entre este año y el necesario para saber cuántos años hay, calcule el día de la semana ya que mi pickADay fue parte de 1970, y lo cambio un día laborable por cada . $shiftTimes = ($yearDifference + $numberOfLeapYears)%7
, en la diferencia. cambie las contraseñas del día $ shiftTimes, entonces sabrá qué día de la semana fue ese día hace esos años, luego encontrará el weekhead y el weektail. Lo mismo se puede usar también para el futuro si parece más simple. Pruébalo si funciona y dime si no funciona.
Solución un poco más ordenada, usando el formato strtotime "[año] W [semana] [día]":
function getStartAndEndDate($week, $year) {
// Adding leading zeros for weeks 1 - 9.
$date_string = $year . ''W'' . sprintf(''%02d'', $week);
$return[0] = date(''Y-n-j'', strtotime($date_string));
$return[1] = date(''Y-n-j'', strtotime($date_string . ''7''));
return $return;
}
Usando la clase DateTime :
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$dto->setISODate($year, $week);
$ret[''week_start''] = $dto->format(''Y-m-d'');
$dto->modify(''+6 days'');
$ret[''week_end''] = $dto->format(''Y-m-d'');
return $ret;
}
$week_array = getStartAndEndDate(52,2013);
print_r($week_array);
Devoluciones:
Array
(
[week_start] => 2013-12-23
[week_end] => 2013-12-29
)
Explicado:
- Crea un nuevo objeto DateTime que por defecto ahora ()
- Llame a setISODate para cambiar el objeto al primer día de $ week of $ year en lugar de now ()
- Formatee la fecha como ''Ymd'' y ponga $ ret [''week_start'']
- Modifique el objeto agregando 6 días, que será el final de $ week
- Formatee la fecha como ''Ymd'' y ponga $ ret [''week_end'']
Una versión más corta (funciona en> = php5.3):
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$ret[''week_start''] = $dto->setISODate($year, $week)->format(''Y-m-d'');
$ret[''week_end''] = $dto->modify(''+6 days'')->format(''Y-m-d'');
return $ret;
}
Podría acortarse con el acceso de miembro de clase en instanciación en> = php5.4.
la forma más corta de hacerlo:
function week_date($week, $year){
$date = new DateTime();
return "first day of the week is ".$date->setISODate($year, $week, "1")->format(''Y-m-d'')
."and last day of the week is ".$date->setISODate($year, $week, "7")->format(''Y-m-d'');
}
echo week_date(12,2014);
function getStartAndEndDate($week, $year)
{
$week_start = new DateTime();
$week_start->setISODate($year,$week);
$return[0] = $week_start->format(''d-M-Y'');
$time = strtotime($return[0], time());
$time += 6*24*3600;
$return[1] = date(''d-M-Y'', $time);
return $return;
}
function getStartAndEndDate($week, $year)
{
$time = strtotime("1 January $year", time());
$day = date(''w'', $time);
$time += ((7*$week)+1-$day)*24*3600;
$return[0] = date(''Y-n-j'', $time);
$time += 6*24*3600;
$return[1] = date(''Y-n-j'', $time);
return $return;
}