我想约会并计算其周数。
到目前为止,我有以下内容。当它应该是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;
?>
数字是否颠倒是错误和巧合?或者我差不多了?
答案 0 :(得分:138)
今天,使用PHP的DateTime
对象更好:
<?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;
?>
答案 1 :(得分:51)
$date_string = "2012-10-18";
echo "Weeknummer: " . date("W", strtotime($date_string));
答案 2 :(得分:12)
使用PHP的日期功能
http://php.net/manual/en/function.date.php
date("W", $yourdate)
答案 3 :(得分:8)
正如建议一样:
<?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)); ?>
答案 4 :(得分:6)
今天到达日期然后告诉本周的周数
<?php
$date=date("W");
echo $date." Week Number";
?>
答案 5 :(得分:1)
<?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错误的参数 - 需要是月/日/年,而不是日/月/年
答案 6 :(得分:0)
您的代码可以使用,但您需要翻转第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}.";
此外,在一周不查看该代码后,您的变量名称会让您感到困惑,您应该考虑阅读http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/
答案 7 :(得分:0)
当您需要一年和一周时变得更加困难。
尝试找出哪个星期是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(date,'%x-%v')
https://www.w3schools.com/sql/func_mysql_date_format.asp
一周,其中星期一是一周的第一天(01到53)。
找不到带有date()或DateTime的相应解决方案。
至少并非没有像“ + 1day,last monday”这样的解决方案。
答案 8 :(得分:0)
如何使用IntlGregorianCalendar
类?
要求:开始使用IntlGregorianCalendar
之前,请确保已在服务器上安装libicu
或pecl/intl
。
因此,请在CLI上运行:
php -m
如果您在intl
列表中看到[PHP Modules]
,则可以使用IntlGregorianCalendar
。
DateTime与IntlGregorianCalendar :
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
答案 9 :(得分:0)
上面给出的大多数示例在一年有53周(例如2020年)时都会产生问题。因此,每四年,您将经历一周的差异。该代码不:
$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
答案 10 :(得分:0)
要获取 jalai日历中的星期数,您可以使用以下方法:
$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
周六的周数更改
答案 11 :(得分:0)
要获取日期为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'));
}
答案 12 :(得分:0)
要获取北美某个日期的星期数,我会这样:
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
答案 13 :(得分:0)
我多年来一直试图解决这个问题,我以为我找到了一个更短的解决方案,但不得不再回到长篇故事。此函数返回正确的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;
}
我发现我的简短解决方案错过了2018-12-31,因为它回复了1801而不是1901.所以我不得不放入这个正确的长版本。
答案 14 :(得分:0)
尝试此解决方案
date( 'W', strtotime( "2017-01-01 + 1 day" ) );
答案 15 :(得分:0)
规则是一年的第一周是包含一年中第一个星期四的一周。
我个人使用Zend_Date进行这种计算,今天的周就是这么简单。如果你使用日期,它们还有许多其他有用的功能。
$now = Zend_Date::now();
$week = $now->get(Zend_Date::WEEK);
// 10
答案 16 :(得分:-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.