如何在父时间范围内获取子时间范围的开始日期


How to get start date of child time frame within parent time frame

我知道月初的确切日期,但我需要知道本月第一周何时开始,本周可以在本月之外开始。

我可以做这样的事情 - 找到"MONTH"开始的工作日并减去"WEEK"开头的天数:

$weekday = d('w', $monthStartTimeStamp);
$weekStart = $monthStartTimeStamp - strtotime('1 day', 0) * (7 - $weekday);

问题:

有没有办法使这种计算在我事先不知道的时间范围内更加通用?

可能的用例:

  1. 给定一些"日期时间",获取第一个"YEAR"的日期时间
  2. 给定一些"DATETIME",获取第一个"MONTH"的日期时间
  3. 给定一些"DATETIME",获取第一个"WEEK"的日期时间
  4. 给定一些"日期时间",获取第一个"DAY"的日期时间
  5. 给定一些"DATETIME",获取第一个"HOUR"的日期时间
  6. 给定一些"日期时间
  7. ",获取第一个"分钟"的日期时间

对于日期时间 2016-01-10 10:30 结果将是:

  1. 发布日期 : 2016-01-01 00:00
  2. 月份 : 2016-01-01 00:00
  3. 星期 : 2016-01-04 00:00
  4. 日期 : 2016-01-10 00:00
  5. 营业时间 : 2016-01-10 10:00
  6. 会议纪要 : 2016-01-10 10:30

P. S. 这里的大多数问题都指定了确切的时间框架,例如"如何开始一年",他们没有回答如何做到这一点。

这是伪代码中的一个想法:

  • 你已经有本周最困难的情况
  • 对于其余部分:将日期转换为类似:YYYYMMDDHHmm,然后根据$interval将正确的 X 字符更改为 0:

'

$int2char = array(
    'YEAR' => 8,
    'MONTH' => 6,
    'DAY' => 4,
    'HOUR' => 2,
    'MINUTE' => 0
);
$interval = 'MONTH';
$str = date("YmdHi", $timestamp);
$zeros = $int2char[$interval];
$d = substring($str, 0, 12-$zeros) . substring("00000000", 0, $zeros);
$date = DateTime::createFromFormat('YmdHi', $d);
echo $date->format('Y-m-d H:i');

'