OSI PI夏令时与非夏令时系统时间冲突排查及Excel公式复现求助
拆解OSI PI夏令时判断公式,顺便帮你找回Excel函数逻辑
嘿,刚好对PI的时间函数比较熟,来给你掰扯清楚这个公式的原理,顺便帮你复现之前的Excel函数!
先搞懂这个PI公式到底在干嘛
这个公式 Floor(Float('*'-'1-jan') / 3600) Mod 24 <> Hour('*') 本质就是判断当前时间(PI里的*代表当前时间戳)是不是处于夏令时时段,核心逻辑是通过对比「无夏令时的理论小时数」和「实际显示的小时数」,不一致就说明夏令时生效了。
拆成小块逐个理解
我把公式拆成一个个部分给你讲:
'*':PI里的特殊符号,代表你要检测的当前时间戳,就是拿来判断的那个时间点。'*'-'1-jan':计算当前时间到当年1月1日0点的时间差,PI里这个差值的单位是秒,比如过了1天就是86400秒。Float(...):把秒数转成浮点型数值,避免整数除法的截断问题。/ 3600:把秒数转换成小时数(1小时=3600秒),得到从年初到现在一共过了多少小时(带小数)。Floor(...):对这个小时数向下取整,得到从年初到当前的完整小时数总和,比如现在是1月1日1点59分,取整后就是1小时。Mod 24:把总小时数对24取模,算出「如果没有夏令时捣乱,现在应该是几点」——因为一天24小时,总小时数除以24的余数就是当天的理论小时数。Hour('*'):直接获取当前时间戳显示的实际小时数,这个是已经包含夏令时调整的(比如夏令时拨快1小时,这里就会比理论值大1)。<>:PI里的「不等于」运算符,当理论小时数和实际小时数不一样时,就说明现在处于夏令时时段!
举个实际例子更明白
比如夏令时生效后某一天:
- 从年初到现在总共过了1234小时,
1234 Mod 24 = 10(24*51=1224,1234-1224=10),这是无夏令时的理论小时数。 - 但夏令时把钟拨快了1小时,实际系统显示的是11点。
- 这时候
10 <> 11结果为真,公式返回true,就说明当前在夏令时里。
要是非夏令时的时候,理论小时数和实际小时数完全一致,公式就返回false。
帮你找回丢失的Excel函数
其实逻辑和PI公式一模一样,你在Excel里可以这么写(假设要判断的时间在A1单元格):
=FLOOR((A1-DATE(YEAR(A1),1,1))*24,1) MOD 24 <> HOUR(A1)
解释下各部分:
A1-DATE(YEAR(A1),1,1):算出当前时间到当年1月1日的天数差。*24:把天数转换成小时数。FLOOR(...,1):向下取整得到累计完整小时数,和PI里的Floor作用一致。MOD 24:取模得到理论小时数。<> HOUR(A1):对比实际小时数,不等就说明是夏令时。
这样就能完美复现你之前的Excel函数效果啦~
内容的提问来源于stack exchange,提问作者Michael Richardson
相关产品推荐
相关产品推荐

