[英]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
)
解釋:
更短的版本(在> = 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;
}
很多年前,我發現了這個功能:
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相對日期嗎? 它可能會奏效。
$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.