PHP 根据年、周数获取周的起止日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 根据年、周数获取周的起止日期相关的知识,希望对你有一定的参考价值。

传入参数 年份year和周数week,希望能得到该周的起止日期
我用的其中一个函数如下:
php code
function getFirstDayOfWeek($year,$week)

$first_day = strtotime($year."-01-01");
$is_monday = date("w", $first_day) == 1;
$is_weekone = strftime("%V", $first_day) == 1;
if($is_weekone)

$week_one_start = $is_monday ? strtotime("last monday", $first_day) : $first_day;

else

$week_one_start = strtotime("next monday", $first_day);

return $year.'第'.$week.'周开始天:'.date('Y-m-d',$week_one_start+(3600*24*7*($week-1)));

用过很多函数之后都发现同一个问题:比如:2014-13-30
用内置的date函数得出的week是 01,即表示2014-13-30是2015的第1周
但是用上面的函数来获取2015的第1周的第一天却是2015-01-05
==========================
我的日期写错了 不是2014-13-30 是2014-12-30
现在的问题是根据year和week倒推出week的起始日期不对
我想函数运行 getFirstDayOfWeek(2015, 1)=2014-12-28 即2015年第一个星期的周日

我也是来找答案的,结果发现两位仁兄都差了点。
那就让我补上这最后这点吧

function getFirstDayOfWeek($year,$week)

$first_day = strtotime($year."-01-01");
$is_monday = date("w", $first_day) == 1;
$week_one_start = !$is_monday ? strtotime("last monday", $first_day) : $first_day;
return $year.'第'.$week.'周开始天:'.date('Y-m-d',$week_one_start+(3600*24*7*($week-1)))
.';结束天为:'.date('Y-m-d',$week_one_start+((3600*24)*(7*($week-1)+6)));
参考技术A 你希望的函数运行 getFirstDayOfWeek(2015, 1) 得到什么样的结果?
是 2015-01-05 还是2014-13-30
-------------------------------------------
试试这个
function getFirstDayOfWeek($year,$week)
$first_day = strtotime($year."-01-01");
$week_t= date("w", $first_day);
$first_week_start = strtotime('-'.$week.' days', $first_day);
return $year.'第'.$week.'周开始天:'.date('Y-m-d',$first_week_start);

如何在Oracle中生成一周的第一天,一周的最后一天和两个日期之间的周数

【中文标题】如何在Oracle中生成一周的第一天,一周的最后一天和两个日期之间的周数【英文标题】:How to generate the first day of the week, the last day of the week and week number between two dates in Oracle 【发布时间】:2021-08-24 22:05:33 【问题描述】:

我想在表格中插入:

从星期一开始的一周的第一天。 一周的最后一天为星期日。 WEEK 编号 =>(1-52 或 1-53)基于 ISO 标准。

首先我尝试选择特定日期的第一天、最后一天和周数,它的工作原理:

WITH ranges AS
(
SELECT to_date('29-10-2012', 'dd-MM-yyyy') AS DATE_TEST FROM DUAL
)
SELECT DATE_TEST "DATE",
TO_CHAR( NEXT_DAY( TRUNC(DATE_TEST) , 'SUNDAY' )) "WEEK END DATE",
TO_CHAR(TO_DATE(DATE_TEST,'DD-MON-YYYY'),'WW')+1 "WEEK NUMBER"
FROM ranges ;

但现在我想在两个日期之间显示这些数据,但我只得到 start_date 的结果。有人可以帮忙。

之后,当一切顺利时,我会将所有内容都插入表格中。

谢谢

WITH ranges AS(
   select to_date('29-OCT-2012', 'dd-MM-yyyy') START_DATE, 
       to_date('31-DEC-2016', 'dd-MM-yyyy') END_DATE 
from  dual 
)
SELECT START_DATE "DATE",
TO_CHAR( NEXT_DAY( TRUNC(START_DATE) , 'SUNDAY' )) "WEEK END DATE",
TO_CHAR(TO_DATE(START_DATE,'DD-MON-YYYY'),'WW')+1 "WEEK NUMBER"
FROM ranges ;

【问题讨论】:

您的第一个代码块产生错误。您的请求逻辑和您的第二个代码块的逻辑根本不匹配。您的查询清楚地要求基于START_DATE 的计算。 END_DATE 根本不参与。也许重写这个问题。你真的在问如何让ranges 输出START_DATEEND_DATE 之间所有日期的列表吗? @dougp 你是对的,复制/粘贴是我的问题对不起。我用正确的代码块修改了第一个代码块 【参考方案1】:

您似乎在寻找日历

根据您的RANGES CTE,还有另一个 - calendar,它利用分层查询创建start_dateend_date 之间的所有日期。获得所有日期后,提取您感兴趣的值。

SQL> with
  2  ranges as
  3    (select to_date('29-OCT-2012', 'dd-MM-yyyy') start_date,
  4            to_date('31-DEC-2016', 'dd-MM-yyyy') end_date
  5     from dual
  6    ),
  7  calendar as
  8    (select start_date + level - 1 as datum
  9     from ranges
 10     connect by level <= end_date - start_date + 1
 11    )
 12  select
 13    min(datum) start_date,
 14    min(next_day(datum, 'sunday')) week_end_date,
 15    to_char(datum, 'ww') week_number
 16  from calendar
 17  group by to_char(datum, 'yyyy'), to_char(datum, 'ww')
 18  order by 1;

START_DATE WEEK_END_D WE
---------- ---------- --
29-10-2012 04-11-2012 44
04-11-2012 11-11-2012 45
11-11-2012 18-11-2012 46
18-11-2012 25-11-2012 47
25-11-2012 02-12-2012 48
<snip>
09-12-2016 11-12-2016 50
16-12-2016 18-12-2016 51
23-12-2016 25-12-2016 52
30-12-2016 01-01-2017 53

222 rows selected.

SQL>

【讨论】:

感谢@littlefoot,这正是我想要的。唯一的问题是周数不正确。第一周应该是 45 和 30-12-2016 到 01-01-2017 应该是 01。第一周的 START_DATE 也有错误,但第二周和第三周......应该从 START_DATE 开始+1 例如第二周应该是 05-NOV-12 到 11-NOV-12 并且对于 09-12-2016 到 11-12-2016 周只有 2 天,而不是 7 天或周一到周日的一周 格式 WW 不会根据 ISO-8601 返回星期数。函数 NEXT_DAY 依赖于当前用户会话 NLS_DATE_LANGUAGE - 这可能不是英语。【参考方案2】:

这是一种使公用表表达式返回日期范围的方法。

with ranges (dt) as (
   select to_date('29-OCT-2012', 'dd-MM-yyyy') as dt
   from dual
   
   union all
   select ranges.dt+1
   from ranges
   where ranges.dt < to_date('31-DEC-2016', 'dd-MM-yyyy')
)

然后你可以用它来计算其他值。

SELECT dt "DATE"
, TO_CHAR(NEXT_DAY(TRUNC(dt), 'SUNDAY')) "WEEK END DATE"
, TO_CHAR(TO_DATE(dt,'DD-MON-YYYY'),'WW') + 1 "WEEK NUMBER"
, cast(TO_CHAR(dt, 'WW') as int) + 
  case when cast(TO_CHAR(dt, 'D') as int) < cast(TO_CHAR(trunc(dt, 'year'), 'D') as int) then 1 else 0 end  WeekNumberInYear

FROM ranges ;

如果您想一次性完成所有日期计算,请在此处查看示例:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=35e407af3b5bf711bb7ae53b8cf0e608

【讨论】:

但是,根据输出,我怀疑您的WEEK END DATE 计算可能不正确。例如,2012 年 11 月 4 日的 WEEK END DATE 不应该是 2012 年 11 月 4 日吗? 格式 WW 不会根据 ISO-8601 返回星期数。函数 NEXT_DAY 依赖于当前用户会话 NLS_DATE_LANGUAGE - 可能不是英语,函数 TO_CHAR(..., 'D') 依赖于当前用户会话 NLS_TERRITORY 设置 - 可能随时更改 ant。 OP 当然应该考虑的事情,就像我在创建适用于我工作地点的代码时所做的那样。【参考方案3】:

你好吗?

为了帮助,我尝试做一些研究,我找到了这些链接。

enter link description here

enter link description here

我找到了:

选择 ROUND((TRUNC(SYSDATE) - TRUNC(SYSDATE, 'YEAR')) / 7,0) CANTWEEK, NEXT_DAY(SYSDATE, 'SUNDAY') - 7 FIRSTDAY, NEXT_DAY(SYSDATE, 'SUNDAY') - 1 LASTDAY 来自双重

选择 to_char(sysdate - to_char(sysdate, 'd') + 2, 'yyyymmdd') first_day_of_week , to_char(sysdate - to_char(sysdate, 'd') + 8, 'yyyymmdd') last_day_of_week 从 双重

今天选择 sysdate AS, TRUNC(next_day(sysdate,'MONDAY')-8) 作为多明戈, TRUNC(next_day(sysdate,'SATURDAY')) 作为 SABADO 来自双重

我这里没有 oracle,所以我无法很好地测试它,但它应该可以解决您的需求,有什么请告诉我 :)

【讨论】:

【参考方案4】:

格式 WW 返回一年中的第几周 (1-53),其中第 1 周从一年的第一天开始,一直持续到一年的第七天,请参阅 Datetime Format Elements

为了根据 ISO-8601 标准使用格式IW 获取星期数。我建议这样:

WITH ranges AS(
    SELECT 
        DATE '2012-10-29' START_DATE,
        DATE '2016-12-31' END_DATE 
    FROM dual 
)
SELECT 
    START_DATE, END_DATE,
    TRUNC(START_DATE + 7*(LEVEL-1), 'IW') AS Week_Start_Date,
    TRUNC(START_DATE + 7*(LEVEL-1), 'IW') + 6 AS Week_End_Date,
    TO_CHAR(TRUNC(START_DATE + 7*(LEVEL-1)), 'IYYY-"W"IW') WEEK_NUMBER
FROM ranges
CONNECT BY START_DATE + 7*(LEVEL-1) <= END_DATE;

【讨论】:

谢谢它正是我正在寻找的,非常感谢所有信息。

以上是关于PHP 根据年、周数获取周的起止日期的主要内容,如果未能解决你的问题,请参考以下文章

hutool日期工具类相关:获取某月所有周某周的起止时间或所有日期计算连续天数

如果根据当前日期获取当前周日期和当前周日期

php 根据周数获取本周的开始时间与最后时间

如何计算当前日期是当年的第几周

获取PHP中给定周数的第一周

mssql怎么查询上周的数据?