亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我有一個月的周數,并且想用 PHP 獲取該周內的第一個日期

我有一個月的周數,并且想用 PHP 獲取該周內的第一個日期

PHP
滄海一幻覺 2023-08-11 17:02:13
假設我有以下給定信息:$year = 2020;  $month = 7;  $week_nr_of_month = 2;  $first_date_in_that_week = ?;我想知道該月該周內的第一個日期。所以在我目前的情況下輸出應該是 2020-07-06我該如何計算這個?謝謝。
查看完整描述

2 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

我有這樣的事情:


<?php


function myDate(int $year, int $month, int $week): string {

  $firstDayDate = DateTime::createFromFormat('j-n-Y', '1-'.$month.'-'.$year);

  $firstDayDate->setTime(0,0);


  $firstMondayDate = (clone $firstDayDate)->modify('first monday of this month');

  $modificator = $week - 2;


  if ($firstMondayDate->format('d') === $firstDayDate->format('d')) {

    $modificator++;

  }


  if ($modificator < 0) {

    return $firstDayDate->format('Y-m-d');

  }


  $wantedWeekDate = (clone $firstMondayDate)->add(new DateInterval('P'.($modificator*7).'D'));

  

  return $wantedWeekDate->format('Y-m-d');

}


var_dump(

myDate(2020, 7, 1),

myDate(2020, 7, 2),

myDate(2020, 7, 3),

myDate(2020, 7, 4),

myDate(2020, 7, 5),

myDate(2020, 7, 6),


myDate(2020, 8, 1),

myDate(2020, 8, 2),

myDate(2020, 8, 3),

myDate(2020, 8, 4),

myDate(2020, 8, 5),

myDate(2020, 8, 6),


myDate(2014, 12, 1),

myDate(2014, 12, 2),

myDate(2014, 12, 3)

);

測試輸出:


string(10) "2020-07-01"

string(10) "2020-07-06"

string(10) "2020-07-13"

string(10) "2020-07-20"

string(10) "2020-07-27"

string(10) "2020-08-03"


string(10) "2020-08-01"

string(10) "2020-08-03"

string(10) "2020-08-10"

string(10) "2020-08-17"

string(10) "2020-08-24"

string(10) "2020-08-31"


string(10) "2014-12-01"

string(10) "2014-12-08"

string(10) "2014-12-15"


查看完整回答
反對 回復 2023-08-11
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

這是我的解決方案:


function firstDayOfWeekInMonth($year, $month, $week)

{

    $firstOfMonth = strtotime("$year-$month-1");

    $format = 'Y-m-d';

    if ($week == 1) {

        return date($format, $firstOfMonth);

    } else {

        $secondsInOneDay = 60 * 60 * 24;

        $secondInOneWeek = $secondsInOneDay * 7;

        $dayNumberOfFirstOfMonth = date('w', $firstOfMonth); //eg Monday = 1, Tuesday = 2, etc.

        $offsetToStartOfWeek = ($dayNumberOfFirstOfMonth - 1) * $secondsInOneDay; // eg Monday is 0 days from Monday, Tuesday is 1 day from Monday etc.

        $startOfWeek1 = $firstOfMonth - $offsetToStartOfWeek; //could be in previous month

        $StartOfWeekN = $startOfWeek1 + ($week - 1) * $secondsInOneWeek; // week-2 is 1-week ahead of week-1's Monday

        return date($format, $StartOfWeekN);

    }

}

該算法使用自 Unix 紀元以來的秒數。這是一個整數,因此所有計算都是通過整數相加或相乘來完成的,這應該相當快。日期和整數之間的轉換僅在函數開始和結束時發生一次。


順便說一句,當我指的是如此多不同的周/月的開始時,我發現為一周的開始找到有意義的名稱是一個很大的挑戰。


為了進行比較,我使用了與布萊希的答案相同的測試:


var_dump(

firstDayOfWeekInMonth(2020, 7, 1),

firstDayOfWeekInMonth(2020, 7, 2),

firstDayOfWeekInMonth(2020, 7, 3),

firstDayOfWeekInMonth(2020, 7, 4),

firstDayOfWeekInMonth(2020, 7, 5),

firstDayOfWeekInMonth(2020, 7, 6),


firstDayOfWeekInMonth(2020, 8, 1),

firstDayOfWeekInMonth(2020, 8, 2),

firstDayOfWeekInMonth(2020, 8, 3),

firstDayOfWeekInMonth(2020, 8, 4),

firstDayOfWeekInMonth(2020, 8, 5),

firstDayOfWeekInMonth(2020, 8, 6),


firstDayOfWeekInMonth(2014, 12, 1),

firstDayOfWeekInMonth(2014, 12, 2),

firstDayOfWeekInMonth(2014, 12, 3)

);

string(10) "2020-07-01"

string(10) "2020-07-06"

string(10) "2020-07-13"

string(10) "2020-07-20"

string(10) "2020-07-27"

string(10) "2020-08-03"

string(10) "2020-08-01"

string(10) "2020-08-03"

string(10) "2020-08-10"

string(10) "2020-08-17"

string(10) "2020-08-24"

string(10) "2020-08-31"

string(10) "2014-12-01"

string(10) "2014-12-08"

string(10) "2014-12-15"


查看完整回答
反對 回復 2023-08-11
  • 2 回答
  • 0 關注
  • 162 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號