在R语言中,force_tz函数与直接设置时区属性tz的区别是什么?
在R语言中设置时区:
force_tz与直接修改tz属性的区别 核心差异
两者的本质区别在于是否改变底层的时间戳数值(POSIXct类型存储的是从1970-01-01 UTC开始计算的秒数):
- 直接修改
tz属性:保留原始时间戳数值,仅改变该时间戳在新时区下的显示方式。 force_tz()函数:修改时间戳数值,将原始的显示时间(年/月/日/时/分/秒)强制绑定到目标时区,相当于重新定义了时间点。
代码示例对比
以下是正确的运行结果:
library(lubridate) # 初始时间:UTC时区的2020-07-04 15:36:50 dd = ymd_hms("2020-07-04 15:36:50") tz(dd) # 输出 "UTC" as.numeric(dd) # 输出 1593886610(底层时间戳) # 方式1:直接修改tz属性 dd1 = dd tz(dd1) <- 'Europe/Zurich' dd1 # 输出 "2020-07-04 17:36:50 CEST" as.numeric(dd1) # 输出 1593886610(和原始时间戳一致) # 方式2:使用force_tz() dd2 = dd dd2 = force_tz(dd2, 'Europe/Zurich') dd2 # 输出 "2020-07-04 15:36:50 CEST" as.numeric(dd2) # 输出 1593879410(时间戳减少了7200秒,即2小时)
详细解释
直接修改
tz属性:
原始时间戳对应的是UTC时区的15:36:50,修改时区为Europe/Zurich(夏季为CEST,比UTC快2小时)后,这个时间戳在CEST时区的显示时间就是UTC时间加2小时,即17:36:50。底层时间点没有变化,只是换了时区标签来解读它。使用
force_tz()函数:
该函数会把原始的"2020-07-04 15:36:50"这个时间字符串,直接当作Europe/Zurich时区的时间。为了让这个时间点的底层时间戳正确,需要将原始时间戳减去2小时(7200秒),这样对应的UTC时间就是13:36:50,而CEST时区显示为15:36:50。相当于重新定义了时间点,底层时间戳发生了改变。
适用场景
- 当你需要保留原始时间点,仅切换显示时区时,直接修改
tz属性更合适。 - 当你需要将某个显示时间强制关联到特定时区(比如你知道字符串是某个时区的时间,但解析时默认用了UTC),使用
force_tz()更准确。
内容的提问来源于stack exchange,提问作者gaut
相关产品推荐
相关产品推荐

