100次浏览 发布时间:2024-08-09 14:04:46
最近在处理时间上碰到一个需求,事实表里的时间是德国时间,需要换算成北京时间,换算的逻辑是夏时制时,北京时间与德国时间相差6个小时,北京时间12点,德国比中国晚6个小时,德国时间是凌晨6点;冬时制时,北京时间与德国时间相差7个小时,北京时间12点,德国比中国晚7个小时,德国时间凌晨5点。
德国每年3月的最后一个星期日到10月的最后一个星期日实行夏时制,其余时间为冬时制。
明确逻辑后,问题就落在了对日期表的日期区分出是夏时制还是冬时制,即是夏令时还是冬令时。冬令时和夏令时的区分就是区分出每年3月的最后一个星期日和10月的最后一个星期日,同一年中在这两个时间之间的就是夏令时,之外的就是冬令时。
可以在日期表里新建两列,一列是每年3月的最后一个星期日,一列是每年10月的最后一个星期日,再建一列判断是冬令时还是夏令时。
日期表里要包含星期几的列来说明那一天是周几,还要有年和月两列:
每年3月最后一个星期日的公式里首先新建一个var变量a表示当前行的年份,然后maxx公式在筛选出的每年3月周日的表里返回3月的最后一个星期日,返回的值既要是3月最后一个星期日还要和所在行的日期是同一年份,同样的逻辑算出每年10月最后一个星期日的计算列。
然后判断冬夏令时:
判断出冬夏令时后,时间换算就迎刃而解了~~
步骤分开写方便理解,但是分三列计算会影响性能,所以把这三个计算列合在一起写:
本场景处理的关键是确定3月最后一个星期日和10月最后一个星期日,类似的在处理某月最后一个周几的时候使用var变量先确定月份所在的是哪一年,然后在筛选的某月周几的表里返回最后一个周几的日期,得出时间节点后就可以做其他的判断了(如冬夏令时)。