我有一系列随机日期(不是来自MySQL)。我需要按周将它们分组为第1周,第2周,依此类推至第5周。
我拥有的是:
$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周时间:
我应该能够通过提供日期来获得第一周的第一周 e.g。
$weekNumber = getWeekNumber('2015-09-01') //output 1;
$weekNumber = getWeekNumber('2015-09-17') //output 3;
答案 0 :(得分:21)
我认为这种关系应该是真实的并且派上用场:
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", ...)
。
答案 1 :(得分:9)
您可以使用以下功能,完全注释:
/**
* 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;
}
答案 2 :(得分:6)
核心方式是
function weekOfMonth($date) {
$firstOfMonth = date("Y-m-01", strtotime($date));
return intval(date("W", strtotime($date))) - intval(date("W", strtotime($firstOfMonth)));
}
答案 3 :(得分:4)
我自己创建了这个功能,这似乎工作正常。如果其他人有更好的方法,请分享..这就是我所做的。
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;
答案 4 :(得分:2)
function getWeekOfMonth(DateTime $date) {
$firstDayOfMonth = new DateTime($date->format('Y-m-1'));
return ceil(($firstDayOfMonth->format('N') + $date->format('j') - 1) / 7);
}
Goendg solution不适用于2016-10-31。
答案 5 :(得分:1)
鉴于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;
}
答案 6 :(得分:1)
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(&#39; 2015-09-17&#39;)//返回3
答案 7 :(得分:1)
您还可以使用此简单公式来查找每月的某周
$currentWeek = ceil((date("d",strtotime($today_date)) - date("w",strtotime($today_date)) - 1) / 7) + 1;
算法:
日期='2018-08-08'=> Y-m-d
答案 8 :(得分:1)
// Current week of the month starts with Sunday
$first_day_of_the_week = 'Sunday';
$start_of_the_week1 = strtotime("Last $first_day_of_the_week");
if (strtolower(date('l')) === strtolower($first_day_of_the_week)) {
$start_of_the_week1 = strtotime('today');
}
$end_of_the_week1 = $start_of_the_week1 + (60 * 60 * 24 * 7) - 1;
// Get the date format
print date('Y-m-d', $start_of_the_week1) . ' 00:00:00';
print date('Y-m-d', $end_of_the_week1) . ' 23:59:59';
答案 9 :(得分:1)
我的功能。主要思想:我们将计算从一个月的第一个日期到现在为止经过的周数。而当前的星期数将是下一个星期。按规则工作:“每周从星期一开始”(对于基于星期天的类型,我们需要转换递增算法)
1 Right Double 1141 449 0 No MozillaWindowClass : (47) Kevin Searcy | LinkedIn - Mozilla Firefox 1
2 Left 1171 468 1000 No MozillaDropShadowWindowClass : 1
3 Left 1506 1909 3000 No MSTaskListWClass : 1
4 Right Double 1311 1631 2000 No EXCEL7 : Email Generator with vlookup 6a.xlsm 1
5 Left 1394 1244 2000 No NetUIHWND : 1
6 Left 1275 1120 1000 No bosa_sdm_XL9 : Paste Special 1
7 Left 1514 1417 1000 No bosa_sdm_XL9 : Paste Special 1
答案 10 :(得分:1)
#[derive(PartialEq, Clone, Copy)]
enum PokemonType {
Fire(Fire),
Water(Water),
}
trait Battle {
fn battle(&self, foe: PokemonType) -> PokemonType;
}
impl Battle for PokemonType {
fn battle(&self, foe: PokemonType) -> PokemonType {
match (self, foe) {
(p1@PokemonType::Water(_), p2@PokemonType::Fire(_)) => {
*p1
// do watever
}
_ => foe // handle other patterns
}
}
}
工作正常。
答案 11 :(得分:0)
我采用了视觉方法(就像我们在现实世界中的做法一样)。我没有使用公式或不使用公式,而是通过可视化文字日历然后将日期放入多维数组中来解决它(或者至少我认为我做到了)。第一个维度对应周。
我希望有人可以检查它是否经得起您的考验。或者用不同的方法帮助别人。
# date in this format 2021-08-03
# week_start is either Sunday or Monday
function getWeekOfMonth($date, $week_start = "Sunday"){
list($year, $month, $day) = explode("-", $date);
$dates = array();
$current_week = 1;
$new_week_signal = $week_start == "Sunday" ? 6 : 0;
for($i = 1; $i <= date("t", strtotime($date)); $i++){
$current_date = strtotime("{$year}-{$month}-".$i);
$dates[$current_week][] = $i;
if(date('w', $current_date) == $new_week_signal){
$current_week++;
}
}
foreach($dates as $week => $days){
if(in_array(intval($day), $days)){
return $week;
}
}
return false;
}
答案 12 :(得分:0)
此函数返回当前月份的整数周数。周总是从星期一开始,计数总是从 1 开始。
function weekOfmonth(DateTime $date)
{
$dayFirstMonday = date_create('first monday of '.$date->format('F Y'))->format('j');
return (int)(($date->format('j') - $dayFirstMonday +7)/7) + ($dayFirstMonday == 1 ? 0 : 1);
}
使用示例
echo weekOfmonth(new DateTime("2020-04-12")); //2
从 1900 年到 2038 年的所有日子的测试,以@Anders 接受的解决方案作为参考:
//reference functions
//integer $date (Timestamp)
function weekOfMonthAnders($date) {
//Get the first day of the month.
$firstOfMonth = strtotime(date("Y-m-01", $date));
//Apply above formula.
return weekOfYear($date) - weekOfYear($firstOfMonth) + 1;
}
function weekOfYear($date) {
$weekOfYear = intval(date("W", $date));
if (date('n', $date) == "1" && $weekOfYear > 51) {
// It's the last week of the previos year.
return 0;
}
else if (date('n', $date) == "12" && $weekOfYear == 1) {
// It's the first week of the next year.
return 53;
}
else {
// It's a "normal" week.
return $weekOfYear;
}
}
//this function
function weekOfmonth(DateTime $date)
{
$dayFirstMonday = date_create('first monday of '.$date->format('F Y'))->format('j');
return (int)(($date->format('j') - $dayFirstMonday +7)/7) + ($dayFirstMonday == 1 ? 0 : 1);
}
$dt = date_create('1900-01-01');
$end = date_create('2038-01-02');
$countOk = 0;
$countError = 0;
for(;$dt < $end; $dt->modify('+1 Day')){
$ts = $dt->getTimestamp();
if(weekOfmonth($dt) === weekOfMonthAnders($ts)){
++$countOk;
}
else {
++$countError;
}
}
echo $countOk.' compare ok, '.$countError.' errors';
结果:50405 比较正常,0 个错误
答案 13 :(得分:0)
这个函数如何利用 PHP 的相对日期? 此函数假定一周在星期六结束。但这很容易改变。
function get_weekNumMonth($date) {
$CI = &get_instance();
$strtotimedate = strtotime($date);
$firstweekEnd = date('j', strtotime("FIRST SATURDAY OF " . date("F", $strtotimedate) . " " . date("Y", $strtotimedate)));
$cutoff = date('j', strtotime($date));
$weekcount = 1;
while ($cutoff > $firstweekEnd) {
$weekcount++;
$firstweekEnd += 7; // move to next week
}
return $weekcount;
}
答案 14 :(得分:0)
$date = new DateTime('first Monday of this month');
$thisMonth = $date->format('m');
$mondays_arr = [];
// Get all the Mondays in the current month and store in array
while ($date->format('m') === $thisMonth) {
//echo $date->format('Y-m-d'), "\n";
$mondays_arr[] = $date->format('d');
$date->modify('next Monday');
}
// Get the day of the week (1-7 from monday to sunday)
$day_of_week = date('N') - 1;
// Get the day of month (1 to 31)
$current_week_monday_date = date('j') - $day_of_week;
/*$day_of_week = date('N',mktime(0, 0, 0, 2, 11, 2020)) - 1;
$current_week_monday_date = date('j',mktime(0, 0, 0, 2, 11, 2020)) - $day_of_week;*/
$week_no = array_search($current_week_monday_date,$mondays_arr) + 1;
echo "Week No: ". $week_no;
答案 15 :(得分:0)
我知道这是一篇老文章,但我有个主意!
$datetime0 = date_create("1970-01-01");
$datetime1 = date_create(date("Y-m-d",mktime(0,0,0,$m,"01",$Y)));
$datetime2 = date_create(date("Y-m-d",mktime(0,0,0,$m,$d,$Y)));
$interval1 = date_diff($datetime0, $datetime1);
$daysdiff1= $interval1->format('%a');
$interval2 = date_diff($datetime0, $datetime2);
$daysdiff2= $interval2->format('%a');
$week1=round($daysdiff1/7);
$week2=round($daysdiff2/7);
$WeekOfMonth=$week2-$week1+1;
答案 16 :(得分:0)
有很多解决方案,但是这是我的一种解决方案,在大多数情况下效果很好。
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);
}
如果您未传递任何值,则接受time()
的unix时间戳,正常日期或返回当前星期。
享受!
答案 17 :(得分:0)
// 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;
答案 18 :(得分:-2)
//It's easy, no need to use php function
//Let's say your date is 2017-07-02
$Date = explode("-","2017-07-02");
$DateNo = $Date[2];
$WeekNo = $DateNo / 7; // devide it with 7
if(is_float($WeekNo) == true)
{
$WeekNo = ceil($WeekNo); //So answer will be 1
}
//If value is not float then ,you got your answer directly