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 관련 날짜를 사용해 보셨나요?작동할 것 같다.
특정 날짜를 사용하고 싶지 않더라도 피할 수 없습니다.날짜만 기준으로 일주일을 계산할 수 있습니다.
단계:
- 초하루를 보다
- 첫 주가 언제 시작하는지 결정합니다(기억나는 경우 첫 번째 목요일이 포함된 규칙이 있습니다).
- 몇 주(첫 번째 파라미터)를 추가합니다.Zend_Date에는 예를 들어 몇 주를 추가할 수 있는 add() 기능이 있습니다.이렇게 하면 일주일 중 첫 번째 날이 나옵니다.
- 상쇄해서 마지막 날을 얻습니다.
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
'programing' 카테고리의 다른 글
PHP에서 특정 유형의 객체를 확인하는 방법 (0) | 2023.09.28 |
---|---|
각도 컴파일러는 무엇을 "컴파일"합니까? (0) | 2023.09.28 |
org.springframework.context 형식입니다.구성 가능한 ApplicationContext를 확인할 수 없습니다.필요한 .class 파일에서 간접적으로 참조됩니다. (0) | 2023.09.28 |
AngularJS - $q.all()에서 오류 복원력 (0) | 2023.09.28 |
어떻게 node.js가 c와 java보다 빠를 수 있습니까?node.js, c, java, python 비교 벤치마크 (0) | 2023.09.28 |