ランダムな日付の配列があります(MySQLからではありません)。 Week1、Week2、…というようにWeek5までの週ごとにグループ化する必要があります。
私が持っているのはこれです:
_$dates = array('2015-09-01','2015-09-05','2015-09-06','2015-09-15','2015-09-17');
_
必要なのは、日付を指定して月の週番号を取得する関数です。
私はdate('W',strtotime('2015-09-01'));
を実行することで週番号を取得できることを知っていますが、この週番号は年(1〜52)の間の番号ですが、月の週番号だけが必要です。 2015年9月には5週間あります:
日付を入力するだけでWeek1を取得できるはずです。
_$weekNumber = getWeekNumber('2015-09-01') //output 1;
$weekNumber = getWeekNumber('2015-09-17') //output 3;
_
この関係は真実であり、役に立つはずだと思います。
_Week of the month = Week of the year - Week of the year of first day of month + 1
_
PHPで実装されています。
_function weekOfMonth($date) {
//Get the first day of the month.
$firstOfMonth = strtotime(date("Y-m-01", $date));
//Apply above formula.
return intval(date("W", $date)) - intval(date("W", $firstOfMonth)) + 1;
}
_
日曜日から始まる週を取得するには、単にdate("W", ...)
をstrftime("%U", ...)
に置き換えます。
完全にコメント化された以下の関数を使用できます。
/**
* Returns the number of week in a month for the specified date.
*
* @param string $date
* @return int
*/
function weekOfMonth($date) {
// estract date parts
list($y, $m, $d) = explode('-', date('Y-m-d', strtotime($date)));
// current week, min 1
$w = 1;
// for each day since the start of the month
for ($i = 1; $i <= $d; ++$i) {
// if that day was a sunday and is not the first day of month
if ($i > 1 && date('w', strtotime("$y-$m-$i")) == 0) {
// increment current week
++$w;
}
}
// now return
return $w;
}
正しい方法は
function weekOfMonth($date) {
$firstOfMonth = date("Y-m-01", strtotime($date));
return intval(date("W", strtotime($date))) - intval(date("W", strtotime($firstOfMonth)));
}
この関数は自分で作成しましたが、正しく機能しているようです。他の誰かがこれを行うためのより良い方法を持っている場合、共有してください..ここに私がやったことがあります。
function weekOfMonth($qDate) {
$dt = strtotime($qDate);
$day = date('j',$dt);
$month = date('m',$dt);
$year = date('Y',$dt);
$totalDays = date('t',$dt);
$weekCnt = 1;
$retWeek = 0;
for($i=1;$i<=$totalDays;$i++) {
$curDay = date("N", mktime(0,0,0,$month,$i,$year));
if($curDay==7) {
if($i==$day) {
$retWeek = $weekCnt+1;
}
$weekCnt++;
} else {
if($i==$day) {
$retWeek = $weekCnt;
}
}
}
return $retWeek;
}
echo weekOfMonth('2015-09-08') // gives me 2;
function getWeekOfMonth(DateTime $date) {
$firstDayOfMonth = new DateTime($date->format('Y-m-1'));
return ceil(($firstDayOfMonth->format('N') + $date->format('j') - 1) / 7);
}
Goendgソリューション は2016-10-31では機能しません。
月の週を見つけるためにこの簡単な式を使用することもできます
$currentWeek = ceil((date("d",strtotime($today_date)) - date("w",strtotime($today_date)) - 1) / 7) + 1;
アルゴリズム:
日付= '2018-08-08' => Y-m-d
function weekOfMonth($strDate) {
$dateArray = explode("-", $strDate);
$date = new DateTime();
$date->setDate($dateArray[0], $dateArray[1], $dateArray[2]);
return floor((date_format($date, 'j') - 1) / 7) + 1;
}
weekOfMonth( '2015-09-17')// 3を返します
firstWday
の月の最初のtime_t wday(0 =日曜日から6 =土曜日)を指定すると、月内の(日曜日ベースの)週番号が返されます。
weekOfMonth = floor((dayOfMonth + firstWday - 1)/7) + 1
PHPに翻訳:
function weekOfMonth($dateString) {
list($year, $month, $mday) = explode("-", $dateString);
$firstWday = date("w",strtotime("$year-$month-1"));
return floor(($mday + $firstWday - 1)/7) + 1;
}
私の機能。主なアイデアは、月の最初の日付から現在までに経過した週数をカウントすることです。そして、現在の週番号は次のものになります。ルール:「週は月曜日から始まる」(日曜日ベースのタイプの場合、増加するアルゴリズムを変換する必要があります)
function GetWeekNumberOfMonth ($date){
echo $date -> format('d.m.Y');
//define current year, month and day in numeric
$_year = $date -> format('Y');
$_month = $date -> format('n');
$_day = $date -> format('j');
$_week = 0; //count of weeks passed
for ($i = 1; $i < $_day; $i++){
echo "\n\n-->";
$_newDate = mktime(0,0,1, $_month, $i, $_year);
echo "\n";
echo date("d.m.Y", $_newDate);
echo "-->";
echo date("N", $_newDate);
//on sunday increasing weeks passed count
if (date("N", $_newDate) == 7){
echo "New week";
$_week += 1;
}
}
return $_week + 1; // as we are counting only passed weeks the current one would be on one higher
}
$date = new DateTime("2019-04-08");
echo "\n\nResult: ". GetWeekNumberOfMonth($date);
多くの解決策がありますが、ほとんどの場合にうまく機能する私の解決策の1つです。
_function current_week ($date = NULL) {
if($date) {
if(is_numeric($date) && ctype_digit($date) && strtotime(date('Y-m-d H:i:s',$date)) === (int)$date)
$unix_timestamp = $date;
else
$unix_timestamp = strtotime($date);
} else $unix_timestamp = time();
return (ceil((date('d', $unix_timestamp) - date('w', $unix_timestamp) - 1) / 7) + 1);
}
_
UNIXタイムスタンプ、通常の日付を受け入れるか、値を渡さない場合はtime()
から現在の週を返します。
楽しい!
// self::DAYS_IN_WEEK = 7;
function getWeeksNumberOfMonth(): int
{
$currentDate = new \DateTime();
$dayNumberInMonth = (int) $currentDate->format('j');
$dayNumberInWeek = (int) $currentDate->format('N');
$dayNumberToLastSunday = $dayNumberInMonth - $dayNumberInWeek;
$daysCountInFirstWeek = $dayNumberToLastSunday % self::DAYS_IN_WEEK;
$weeksCountToLastSunday = ($dayNumberToLastSunday - $daysCountInFirstWeek) / self::DAYS_IN_WEEK;
$weeks = [];
array_Push($weeks, $daysCountInFirstWeek);
for ($i = 0; $i < $weeksCountToLastSunday; $i++) {
array_Push($weeks, self::DAYS_IN_WEEK);
}
array_Push($weeks, $dayNumberInWeek);
if (array_sum($weeks) !== $dayNumberInMonth) {
throw new Exception('Logic is not valid');
}
return count($weeks);
}
短いバリアント:
(int) (new \DateTime())->format('W') - (int) (new \DateTime('first day of this month'))->format('W') + 1;