簡體   English   中英

PHP按周數獲取一周的開始和結束日期

[英]PHP get start and end date of a week by weeknumber

我已經看到了這個問題的一些變種,但我相信這個還沒有得到回答。

我需要得到一周的開始日期和結束日期,按年份和周數選擇(不是日期)

例:

輸入:

getStartAndEndDate($week, $year);

輸出:

$return[0] = $firstDay;
$return[1] = $lastDay;

返回值將類似於一個數組,其中第一個條目是星期開始日期,第二個條目是結束日期。

可選:當我們在它時,日期格式需要是Ynj (正常日期格式,沒有前導零。

我已經嘗試編輯幾乎完成我想要的現有功能,但到目前為止我沒有運氣。

請幫助我,提前謝謝。

使用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
)

解釋:

  • 創建一個默認為now()的新DateTime對象
  • 調用setISODate將對象更改為$ year的$ week的第一天而不是now()
  • 格式化日期為'Ymd'並放入$ ret ['week_start']
  • 通過添加6天來修改對象,這將是$ week的結束
  • 格式化日期為'Ymd'並放入$ 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()函數有三個參數: $year$week$day ,其中$day默認為1 - 一周的第一天。 因此,我們通過7來獲得$week的第7天的確切日期。

使用“[year] W [week] [day]”strtotime格式的稍微整潔的解決方案:

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);

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;
}

您可以從我的第一天和最后一天到達日期的具體日期

$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年1月6日

首先,我們需要從那個星期開始一天,因此通過了解周數並知道一周有七天我們將要這樣做

$pickADay = ($weekNo-1) * 7 + 3;

這樣pickAday將是我們所需的一周中的一天。

現在因為我們知道這一年我們可以檢查哪一天。 如果我們只需要比unix時間戳更新的日期,那么事情很簡單我們將獲得一年中第一天的unix時間戳並添加到24*3600*$pickADay ,這一切都很簡單,因為我們有它的時間戳我們可以知道什么它是星期幾,並相應地計算那一周的頭尾。

如果我們想要找出1848年第12周的相同內容,我們必須使用另一種方法,因為我們無法獲得時間戳。 知道每一年的每一天都會提前1個工作日的意思(去年11月1日是星期日,今年是星期一,閏年的例外是2天我相信,你可以檢查一下)。 如果年份大於1970年,我會做什么,而不是在它和需要的年份之間做出差異,知道有多少年,計算星期幾,因為我的pickADay是1970年的一部分,每個工作日返回一個。 $shiftTimes = ($yearDifference + $numberOfLeapYears)%7 ,差別。 轉移一天的后退詞$ shiftTimes,那么你就會知道那幾年的那一天是哪一天,然后找到周末和周尾。 如果它看起來更簡單,也可以用於未來。 嘗試它,如果它的工作,並告訴我,如果它沒有。

對於文檔(因為谷歌在搜索“本周的php datetime start end”時首先排名這個問題)。

如果您需要當前周的startdate和enddate(使用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

希望這會有所幫助。

你試過PHP相對日期嗎? 它可能會奏效。

即使你不想使用特定的日期,你也無法擺脫它。 您只能根據日期計算一周。

腳步:

  1. 得到一年的第一天
  2. 決定第一周何時開始(如果我記得,有一些規則包括第一個星期四。
  3. 添加一些周(你的第一個參數)。 Zend_Date有一個add()函數,例如你可以添加周。 這將為您提供一周的第一天。
  4. 抵消並獲得最后一天。

我建議使用像Zend_DatePear Date這樣的一致日期系統。

$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

希望能有所幫助

“一周的第一天”是主觀的。 有些文化使用“星期一”其他人“星期日”,也許其他人有別的東西?

為了我的目的,我希望一周的第一天是“星期日”,一周的最后一天是“星期六”。

此外,使用不帶參數的DateTime將默認為“now”,其中包括當前時間。 以下方法將通過在DateTime構造函數中指定“today”來忽略當前時間。

此外,字符串“本周的星期日”似乎並不可靠。 它實際上將在下周的星期日返回(根據我對一周的看法)。

我已經構建了一個返回包含兩個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 )
    ];
}
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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM