programing

PHP는 주 번호별로 주 시작일과 종료일을 가져옵니다.

muds 2023. 9. 28. 08:50
반응형

PHP는 주 번호별로 주 시작일과 종료일을 가져옵니다.

이 질문에 대해 몇 가지 변형을 보았지만 아직 답이 나오지 않은 것 같습니다.

시작 날짜와 종료 날짜를 연도와 주 번호로 선택해야 합니다(날짜가 아님).

예:

입력:

getStartAndEndDate($week, $year);

출력:

$return[0] = $firstDay;
$return[1] = $lastDay;

반환 값은 첫 번째 항목이 주 시작 날짜이고 두 번째 항목이 종료 날짜인 배열과 같습니다.

이 날짜 형식은 : 이어야 .Y-n-j(일반 날짜 형식, 선행 0 없음).

내가 원하는 대로 할 뻔 했던 기존 기능들을 편집해보았지만 아직까지 운이 없었습니다.

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);

반환:

Array
(
    [week_start] => 2013-12-23
    [week_end] => 2013-12-29
)

설명:

  • 지금()으로 기본 설정된 새 DateTime 개체 만들기
  • 콜셋지금이 아닌 $year의 첫 번째 주로 개체를 변경하는 ISO 날짜)
  • 날짜를 'Y-m-d'로 포맷하고 $ret['week_start']를 입력합니다.
  • $week의 마지막이 되는 6일을 추가하여 개체 수정
  • 날짜를 'Y-m-d'로 포맷하고 $ret['week_end']를 입력합니다.

더 짧은 버전( >= 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;
}

>= php5.4에서 인스턴스화클래스 멤버 액세스로 단축할 수 있습니다.

수년 전에 다음과 같은 기능을 발견했습니다.

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);

우리는 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
   ];
}

setISODate()에는 function합니다라는 세 .$year,$week,그리고.$day서,$day기본값은 1 - 한 주의 첫 번째 날입니다.한 7다 7합니다.$week.

[[연도]]를 사용하여 약간 더 효율적인 솔루션을 제공W[week][day]" str to time 형식:

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;
}

가장 짧은 방법:

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);

내가 처음과 마지막 날을 받은 날짜를 아래와 같이 날짜로부터 특정 요일을 받을 수 있습니다.

$date = date_create();

// get the first day of the week
date_isodate_set($date, 2019, 1);

    //convert date format and show     
    echo date_format($date, 'Y-m-d') . "\n";

// get the last date of the week
date_isodate_set($date, 2019, 1, 7);

     //convert date format and show        
     echo date_format($date, 'Y-m-d') . "\n";

출력 =>

2018-12-31

2019-01-06

"일주일의 첫날"은 주관적입니다.어떤 문화들은 "월요일"을 다른 "일요일"을 사용하고, 다른 문화들은 다른 어떤 것을 사용하나요?

제 목적상, 저는 한 주의 첫 번째 날을 "일요일"로 하고 마지막 날을 "토요일"로 하고 싶습니다.

, DateTime인수가 없으면 현재 시간을 포함하는 "now"(지금)로 기본 설정됩니다.다음 메서드는 DateTime 생성자에 "오늘"을 지정하여 현재 시간을 무시합니다.

게다가 "이번 주 일요일"이라는 문자열은 신뢰할 수 없을 것 같습니다.실제로 다음 주 일요일에 돌아올 것입니다. (일주일이 무엇인지에 대한 제 견해에 따르면)

DateTime 객체가 두 개 포함된 PHP 객체를 반환하는 방법을 만들었습니다.하나는 해당 주의 첫 번째 날(일요일), 두 번째는 해당 주의 마지막 날(토요일)입니다.

function get_first_and_last_day_of_week( $year_number, $week_number ) {
    // we need to specify 'today' otherwise datetime constructor uses 'now' which includes current time
    $today = new DateTime( 'today' );

    return (object) [
        'first_day' => clone $today->setISODate( $year_number, $week_number, 0 ),
        'last_day'  => clone $today->setISODate( $year_number, $week_number, 6 )
    ];
}

Roham Rafii의 계산이 틀렸습니다.간단한 해결책은 다음과 같습니다.

// week number to timestamp (first day of week number)
function wn2ts($week, $year) {
    return strtotime(sprintf('%dW%02d', $year, $week));
}

이 마지막 , , 를 됩니다.6 * 24 * 3600

이것은 오래된 질문이지만, 위에 게시된 많은 답변들이 틀린 것 같습니다.저는 제 나름의 해결책을 생각해 냈습니다.

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;
}

우선 우리는 그 주부터 하루가 필요하기 때문에 주 번호를 알고 한 주에 7일이 있다는 것을 알게 됨으로써 우리는 그렇게 할 것입니다.

$pickADay = ($weekNo-1) * 7 + 3;

이렇게 선택하면 하루는 우리가 원하는 주에 하루가 될 것입니다.

이제 우리는 그 날이 언제인지 확인할 수 있기 때문입니다. 보다 더 . 의 첫 유닉스 타임스탬프보다 더 새로운 날짜만 필요하다면 일은 간단합니다할 것입니다. 우리는 올해 첫 날의 유닉스 타임스탬프를 받고 그것에 추가할 것입니다.24*3600*$pickADay타임스탬프가 있기 때문에 모든 것이 간단합니다. 타임스탬프가 있기 때문에 해당 요일을 알 수 있고 그에 따라 해당 요일의 머리와 꼬리를 계산할 수 있습니다.

만약 우리가 1848년 12주차와 같은 것을 알아내려면 타임스탬프를 얻을 수 없기 때문에 다른 접근법을 사용해야 합니다.매년 하루가 평일 1개씩 앞선다는 것을 알고 있습니다(작년 11월 1일은 일요일, 올해는 월요일, 윤년은 2일 앞선다는 것을 제외하면 확인 가능합니다.더 몇 인지 알 수가 있다면 할 것인가요?인가요 을 선택한 로 계산하십시오. 요일을 내가 선택한 것으로 계산합니다.하루는 1970년의 일부였고, 각각의 평일로 하루씩 옮겼습니다.$shiftTimes = ($yearDifference + $numberOfLeapYears)%7에서에 shift $shift $shift.Times, 그러면 여러분은 그 몇 년 전 그 날이 무슨 요일이었는지 알게 될 것이고, 그리고 나서 주두와 주두를 찾게 될 것입니다.더 단순해 보인다면 미래에도 같은 것을 사용할 수 있습니다.잘 되면 해보고 안 되면 말해주세요.

문서화를 위해 (Google은 "php date time start end this week"를 검색할 때 이 질문의 순위를 먼저 매깁니다).

현재 주의 시작 날짜 및 종료 날짜(DateTime 사용)가 필요한 경우:

$dateTime = new DateTime('now');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');

var_dump($monday->format('Y-m-d')); // e.g. 2018-06-25
var_dump($sunday->format('Y-m-d')); // e.g. 2018-07-01

이것이 도움이 되길 바랍니다.

주 번호로 날짜를 구하세요, 이것은 1년 내내 저의 예입니다.

<?php
   $year = "2023";
   for($i = 1; $i <= 52; $i++){
       print_r([
          (new DateTime())->setISODate($year, $i)->format('Y-m-d'), //start date
          (new DateTime())->setISODate($year, $i, 7)->format('Y-m-d') //end date
      ]);
  }
?>

PHP 관련 날짜를 사용해 보셨나요?작동할 것 같다.

특정 날짜를 사용하고 싶지 않더라도 피할 수 없습니다.날짜만 기준으로 일주일을 계산할 수 있습니다.

단계:

  1. 초하루를 보다
  2. 첫 주가 언제 시작하는지 결정합니다(기억나는 경우 첫 번째 목요일이 포함된 규칙이 있습니다).
  3. 몇 주(첫 번째 파라미터)를 추가합니다.Zend_Date에는 예를 들어 몇 주를 추가할 수 있는 add() 기능이 있습니다.이렇게 하면 일주일 중 첫 번째 날이 나옵니다.
  4. 상쇄해서 마지막 날을 얻습니다.

Zend_Date 또는 Pear Date와 같은 일관된 날짜 시스템으로 작업하는 것을 추천합니다.

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;
    }
$dateParam = '2018-06-10';
$week = date('w', strtotime($dateParam));
$date = new DateTime($dateParam);
$firstWeek = $date->modify("-".$week." day")->format("Y-m-d H:i:s");
$endWeek = $date->modify("+6 day")->format("Y-m-d H:i:s");
echo $firstWeek."<br/>";
echo $endWeek;

인쇄할 것입니다

2018-06-10 00:00:00
2018-06-16 00:00:00

도움이 되기를 바랍니다.

대부분의 경우 입력 필드는 양식에서 제공되며 주 유형입니다.

<html>
<input type="week" name="weekDate">
</html>

<?php 
    $postDate = $_POST['weekDate'];
    $date = new DateTime($postDate );
    $startDate = $date->format('Y-m-d');
    $date->modify('+6 day');
    $endDate = $date->format('Y-m-d');
?>

아니면

<?php 
function getDatesFromWeek($weekDate){
    $date = new DateTime($weekDate);
    $startDate = $date->format('Y-m-d');
    $date->modify('+6 day');
    $endDate = $date->format('Y-m-d');
    return $dates[] = ['startDate'=>$startDate, 'endDate'=>$endDate];
}
?>

언급URL : https://stackoverflow.com/questions/4861384/php-get-start-and-end-date-of-a-week-by-weeknumber

반응형