PHP中如何对非当前时间的DateTime使用相对日期格式功能
PHP DateTime相对格式非当前时间应用方案
PHP原生DateTime扩展已原生支持对任意指定基准日期应用相对格式规则,无需自定义函数做日期拼接,也无需额外引入第三方类库。
两种预期写法的正确实现
你提到的两种使用方式本身是可行的,只是需要匹配PHP解析相对格式的内置规则,调整写法即可。
直接构造传参实现
PHP解析日期字符串遵循从左到右的顺序,前面解析得到的时间会自动作为后续相对规则的计算基准,你之前把相对规则放在基准日期前面的语序无法被正确解析,调换顺序即可:
// 基准日期放字符串最前,后面跟相对格式规则 $date = new DateTime('4 Jun 2022 first monday of this week'); echo $date->format('Y-m-d'); // 输出2022-05-30,和预期结果一致已有DateTime实例调用modify实现
你之前写的
modify('first monday of week')不生效,是因为单独的week关键字没有上下文指代,会永远锚定系统当前时间所在周,只要加上this明确绑定实例自身的时间上下文即可:$time = DateTime::createFromFormat('Y-m-d H:i:s', '2022-06-04 12:00:00'); $time->modify('first monday of this week'); echo $time->format('Y-m-d'); // 输出2022-05-30,符合预期
常见使用注意点
- 所有带
this前缀的相对时间描述(this week/this month/this year),在modify()、add()、sub()方法中调用时,都会自动以当前DateTime实例的时间作为计算基准,不会读取系统当前时间 - 构造函数传参时,绝对基准时间必须放在字符串最前端,后续追加的相对规则会基于前面解析出的时间依次计算
- 不要使用无指代的
of week/of month写法,这类写法的计算基准永远是系统当前时间,必须加this明确绑定上下文 - 复杂的跨周期日期计算可以配合原生
DateInterval、DatePeriod类实现,能覆盖绝大多数业务场景。如果偏好更简洁的链式调用语法,基于原生DateTime封装的常用日期类库也可以直接使用,底层调用的还是官方的相对格式解析能力。
内容的提问来源于stack exchange,提问作者Deggy
相关产品推荐
相关产品推荐

