如何使用Twig正确比较含PM的12小时制时间?
如何正确在Twig中比较12小时制的营业时间与当前时间?
你遇到的问题其实很典型——用12小时制格式h:i:s处理下午时间时,会把15:00这类下午时间转成03:00,导致字符串比较完全失效。而且加时区格式符P只是在字符串末尾追加时区信息,并不会改变时间本身的数值比较逻辑,所以自然没用。
给你两个靠谱的解决方案:
方案1:改用24小时制格式进行字符串比较
直接把时间格式换成24小时制的H:i:s(注意是大写的H),这样所有时间都会以00:00-23:59的形式呈现,字符串的字典序和时间的先后顺序完全一致,比较逻辑就正常了:
{% if etablissement.horraire | date('H:i:s') < date() | date('H:i:s') and etablissement.horraireF | date('H:i:s') > date() | date('H:i:s') %} <!-- 这里写营业中的逻辑 --> {% endif %}
比如15:00会被格式化为"15:00:00",和08:00的"08:00:00"、22:00的"22:00:00"比较时,字符串大小就能准确反映时间先后,不会再出现下午时间被当成凌晨的错误。
方案2:直接比较DateTime对象(更推荐)
如果etablissement.horraire和etablissement.horraireF本身就是DateTime类型的对象,那完全没必要转成字符串,直接比较对象本身更准确,还能避免格式转换可能带来的问题:
{% set current_time = date() %} {% if etablissement.horraire < current_time and etablissement.horraireF > current_time %} <!-- 营业中逻辑 --> {% endif %}
Twig会自动处理DateTime对象的比较,底层是基于时间戳的,比字符串比较更可靠,也更简洁。
为什么之前的写法会出错?
- 用
h:i:s(小写h)是12小时制,下午1点到11点会被转成01:00-11:00,所以15:00变成03:00,字符串比较时"03:00:00"会被认为比"08:00:00"小,导致判断错误。 - 加
P只是在字符串后面加上时区标识(比如+02:00),但字符串比较是从左到右逐字符对比的,开头的"03"还是比"08"小,所以根本解决不了问题。
内容的提问来源于stack exchange,提问作者Zain Elabidine
相关产品推荐
相关产品推荐

