날짜 PHP에서 주 번호(년)를 가져옵니다.
날짜를 잡아서 주 번호를 계산하고 싶어요.
여기까지는 다음과 같은 내용이 있습니다.42가 되어야 할 때 24가 돌아온다.
<?php
$ddate = "2012-10-18";
$duedt = explode("-",$ddate);
$date = mktime(0, 0, 0, $duedt[2], $duedt[1],$duedt[0]);
$week = (int)date('W', $date);
echo "Weeknummer: ".$week;
?>
숫자가 뒤바뀌는 게 잘못이고 우연일까요?아니면 거의 다 왔나요?
현재는 PHP 개체를 사용하는 것이 더 좋습니다.
<?php
$ddate = "2012-10-18";
$date = new DateTime($ddate);
$week = $date->format("W");
echo "Weeknummer: $week";
왜냐하면mktime()
,그건 이런 식이다:
mktime(hour, minute, second, month, day, year);
그래서 당신의 주문이 틀렸습니다.
<?php
$ddate = "2012-10-18";
$duedt = explode("-", $ddate);
$date = mktime(0, 0, 0, $duedt[1], $duedt[2], $duedt[0]);
$week = (int)date('W', $date);
echo "Weeknummer: " . $week;
?>
$date_string = "2012-10-18";
echo "Weeknummer: " . date("W", strtotime($date_string));
PHP의 날짜 함수 사용
http://php.net/manual/en/function.date.php
date("W", $yourdate)
이것은 오늘 날짜를 얻어서 그 주의 주 번호를 말해라.
<?php
$date=date("W");
echo $date." Week Number";
?>
제안 하나 하자면:
<?php echo date("W", strtotime("2012-10-18")); ?>
다른 사람들보다 조금 더 간단할 수도 있어
기타 할 수 있는 작업:
<?php echo date("Weeknumber: W", strtotime("2012-10-18 01:00:00")); ?>
<?php echo date("Weeknumber: W", strtotime($MY_DATE)); ?>
년과 주가 필요할 때 더 어려워집니다.
2017년 1월 1일이 무슨 주인지 알아보세요.
(2016년 52주차(2016년 12월 26일 ~ 2017년 1월 1일)입니다).
한참을 검색한 결과
strftime('%G-%V',strtotime("2017-01-01"))
결과: 2016-52
https://www.php.net/manual/de/function.strftime.php
ISO-8601:1988 주 번호(평일이 4개 이상인 해의 첫 번째 주부터 시작), 월요일이 주의 시작입니다.(01 ~ 53)
mysql에 해당하는 것은 DATE_FORMAT(날짜, %x-%v') https://www.w3schools.com/sql/func_mysql_date_format.asp 입니다.
Week 월요일은 주의 첫 번째 요일(01 ~53)입니다.
DateTime으로 대응하는 솔루션을 찾을 수 없습니다.
적어도 "+1day, last monday"와 같은 솔루션이 없으면 안 됩니다.
편집: strftime은 더 이상 사용되지 않으므로 날짜를 사용할 수도 있습니다.검증은 안 했는데.
date('o-W',strtotime("2017-01-01"));
나는 이 문제를 해결하려고 몇 년 동안 노력했지만, 더 짧은 해결책을 찾았다고 생각했지만, 다시 긴 이야기로 돌아와야 했다.이 함수는 올바른 ISO 주 표기법을 반환합니다.
/**
* calcweek("2018-12-31") => 1901
* This function calculates the production weeknumber according to the start on
* monday and with at least 4 days in the new year. Given that the $date has
* the following format Y-m-d then the outcome is and integer.
*
* @author M.S.B. Bachus
*
* @param date-notation PHP "Y-m-d" showing the data as yyyy-mm-dd
* @return integer
**/
function calcweek($date) {
// 1. Convert input to $year, $month, $day
$dateset = strtotime($date);
$year = date("Y", $dateset);
$month = date("m", $dateset);
$day = date("d", $dateset);
$referenceday = getdate(mktime(0,0,0, $month, $day, $year));
$jan1day = getdate(mktime(0,0,0,1,1,$referenceday[year]));
// 2. check if $year is a leapyear
if ( ($year%4==0 && $year%100!=0) || $year%400==0) {
$leapyear = true;
} else {
$leapyear = false;
}
// 3. check if $year-1 is a leapyear
if ( (($year-1)%4==0 && ($year-1)%100!=0) || ($year-1)%400==0 ) {
$leapyearprev = true;
} else {
$leapyearprev = false;
}
// 4. find the dayofyearnumber for y m d
$mnth = array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
$dayofyearnumber = $day + $mnth[$month-1];
if ( $leapyear && $month > 2 ) { $dayofyearnumber++; }
// 5. find the jan1weekday for y (monday=1, sunday=7)
$yy = ($year-1)%100;
$c = ($year-1) - $yy;
$g = $yy + intval($yy/4);
$jan1weekday = 1+((((intval($c/100)%4)*5)+$g)%7);
// 6. find the weekday for y m d
$h = $dayofyearnumber + ($jan1weekday-1);
$weekday = 1+(($h-1)%7);
// 7. find if y m d falls in yearnumber y-1, weeknumber 52 or 53
$foundweeknum = false;
if ( $dayofyearnumber <= (8-$jan1weekday) && $jan1weekday > 4 ) {
$yearnumber = $year - 1;
if ( $jan1weekday = 5 || ( $jan1weekday = 6 && $leapyearprev )) {
$weeknumber = 53;
} else {
$weeknumber = 52;
}
$foundweeknum = true;
} else {
$yearnumber = $year;
}
// 8. find if y m d falls in yearnumber y+1, weeknumber 1
if ( $yearnumber == $year && !$foundweeknum) {
if ( $leapyear ) {
$i = 366;
} else {
$i = 365;
}
if ( ($i - $dayofyearnumber) < (4 - $weekday) ) {
$yearnumber = $year + 1;
$weeknumber = 1;
$foundweeknum = true;
}
}
// 9. find if y m d falls in yearnumber y, weeknumber 1 through 53
if ( $yearnumber == $year && !$foundweeknum ) {
$j = $dayofyearnumber + (7 - $weekday) + ($jan1weekday - 1);
$weeknumber = intval( $j/7 );
if ( $jan1weekday > 4 ) { $weeknumber--; }
}
// 10. output iso week number (YYWW)
return ($yearnumber-2000)*100+$weeknumber;
}
나는 나의 쇼트 솔루션이 1901이 아닌 1801을 돌려주었기 때문에 2018-12-31을 놓쳤다는 것을 알게 되었다.그래서 저는 이 긴 버전을 넣어야 했습니다. 정답입니다.
를 사용하는 것은 어떨까요?IntlGregorianCalendar
수업?
요건:사용하기 전에IntlGregorianCalendar
확실히 하다libicu
또는pecl/intl
가 서버에 인스톨 됩니다.CLI 상에서 실행합니다.
php -m
보시면intl
에서[PHP Modules]
목록을 작성하면IntlGregorianCalendar
.
날짜 시간 vs 국제 일정:IntlGregorianCalendar
그럼 더 낫지 않아DateTime
하지만 좋은 점은IntlGregorianCalendar
주 번호를 알려준다는 것입니다.int
.
예:
$dateTime = new DateTime('21-09-2020 09:00:00');
echo $dateTime->format("W"); // string '39'
$intlCalendar = IntlCalendar::fromDateTime ('21-09-2020 09:00:00');
echo $intlCalendar->get(IntlCalendar::FIELD_WEEK_OF_YEAR); // integer 39
<?php
$ddate = "2012-10-18";
$duedt = explode("-",$ddate);
$date = mktime(0, 0, 0, $duedt[1], $duedt[2],$duedt[0]);
$week = (int)date('W', $date);
echo "Weeknummer: ".$week;
?>
mktime에 대한 매개 변수가 잘못되었습니다. 일/월/년이 아닌 월/일/년이어야 합니다.
북미 데이트 주 번호를 얻으려면 다음과 같이 합니다.
function week_number($n)
{
$w = date('w', $n);
return 1 + date('z', $n + (6 - $w) * 24 * 3600) / 7;
}
$n = strtotime('2022-12-27');
printf("%s: %d\n", date('D Y-m-d', $n), week_number($n));
다음 정보를 얻을 수 있습니다.
Tue 2022-12-27: 53
위의 예 중 대부분은 1년이 53주(2020년 등)일 때 문제가 발생합니다.따라서 4년마다 1주일씩 차이가 납니다.이 코드는 다음과 같습니다.
$thisYear = "2020";
$thisDate = "2020-04-24"; //or any other custom date
$weeknr = date("W", strtotime($thisDate)); //when you want the weeknumber of a specific week, or just enter the weeknumber yourself
$tempDatum = new DateTime();
$tempDatum->setISODate($thisYear, $weeknr);
$tempDatum_start = $tempDatum->format('Y-m-d');
$tempDatum->setISODate($thisYear, $weeknr, 7);
$tempDatum_end = $tempDatum->format('Y-m-d');
echo $tempDatum_start //will output the date of monday
echo $tempDatum_end // will output the date of sunday
코드는 작동하지만 4번째와 5번째 인수를 뒤집어야 합니다.
나는 이렇게 할 것이다.
$date_string = "2012-10-18";
$date_int = strtotime($date_string);
$date_date = date($date_int);
$week_number = date('W', $date_date);
echo "Weeknumber: {$week_number}.";
또, 변수명은, 그 코드를 참조하지 않고 1주일 경과하면 혼란스러울 것입니다.http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/ 를 참조해 주세요.
한 해의 첫 번째 주는 한 해의 첫 번째 목요일을 포함하는 주라는 규칙입니다.
저는 개인적으로 이런 계산을 할 때 Zend_Date를 사용하고 있는데, 오늘의 주를 구하는 것은 이 정도로 간단합니다.날짜로 작업하면 다른 유용한 기능이 많이 있습니다.
$now = Zend_Date::now();
$week = $now->get(Zend_Date::WEEK);
// 10
2018-12-31 날짜의 정확한 주수를 얻으려면 아래 코드를 사용하십시오.
$day_count = date('N',strtotime('2018-12-31'));
$week_count = date('W',strtotime('2018-12-31'));
if($week_count=='01' && date('m',strtotime('2018-12-31'))==12){
$yr_count = date('y',strtotime('2018-12-31')) + 1;
}else{
$yr_count = date('y',strtotime('2018-12-31'));
}
jalai 캘린더의 week number를 취득하려면 , 다음의 것을 사용할 수 있습니다.
$weeknumber = date("W"); //number week in year
$dayweek = date("w"); //number day in week
if ($dayweek == "6")
{
$weeknumberint = (int)$weeknumber;
$date2int++;
$weeknumber = (string)$date2int;
}
echo $date2;
결과:
15
토요일의 주 번호 변경
매우 심플한 한 줄:
<?php $date=date("W"); echo "Week " . $date; ?>"
예를 들어 그래프에 필요했던 것처럼 빼서 다음과 같이 지난 주를 얻을 수도 있습니다.
<?php $date=date("W"); echo "Week " . ($date - 1); ?>
function last_monday($date)
{
if (!is_numeric($date))
$date = strtotime($date);
if (date('w', $date) == 1)
return $date;
else
return date('Y-m-d',strtotime('last monday',$date));
}
$date = '2021-01-04'; //Enter custom date
$year = date('Y',strtotime($date));
$date1 = new DateTime($date);
$ldate = last_monday($year."-01-01");
$date2 = new DateTime($ldate);
$diff = $date2->diff($date1)->format("%a");
$diff = $diff/7;
$week = intval($diff) + 1;
echo $week;
//Returns 2.
이 해결책을 시험해 보다
date( 'W', strtotime( "2017-01-01 + 1 day" ) );
언급URL : https://stackoverflow.com/questions/9567673/get-week-number-in-the-year-from-a-date-php
'source' 카테고리의 다른 글
MySQL ENUM 유형 vs 조인 테이블 (0) | 2022.11.04 |
---|---|
jQuery는 같은 클래스의 요소를 루프합니다. (0) | 2022.11.04 |
backbone.js의 목적은 무엇입니까? (0) | 2022.11.04 |
임베디드 객체 속성별로 스프링 데이터 JPA 찾기 (0) | 2022.11.04 |
Python에서 검출된 예외의 이름을 얻는 방법은 무엇입니까? (0) | 2022.11.04 |