【上一篇:67.关于时间跨度-time span(三)】
【下一篇:69.关于编程技巧的提升开篇】
时区划分的知识
地球上有人为划分的共有24个时区,每个时区跨越经度15°。相邻的两个时区的时间相差一小时。每个时区有一条中央子午线,以中央子午线上的时间作为整个时区的时间。有了时区,可以方便不同国家和地区的人换算本地时间和其他地方的时间。
以本初子午线(0°经线)所在的时区为零时区(UTC,Coordinated Universal Time,协调世界时,科学界使用的标准时区,相当于它的前身GMT(格林尼治标准时间)。零时区向东为东1-12区,向西为西1-12区。因为地球自西向东自转,所以东边的时间比西边的时间早。东经180°为国际日期分界线。
各时区与UTC的偏移量:例如东八区表示为UTC + 8:00,西八区表示为UTC - 8:00。
但是,仅使用地理上的时区对同一个国家或地区的人来说也不方便,因为一个国家或地区可能跨越多个时区。因此,为了行政上的方便,时区并不按经线位置进行划分,而是按照自然地理位置划分。例如中国跨越5个时区,但全国各地都以东八区的时间(北京时间)为准。
现在世界各地的时区表示方式有两种,一种是用数字表示,例如+03表示UTC +3:00、+0530表示UTC +05:30;另一种是行政定义的时区,例如China Standard Time(中国标准时间,CST,等于UTC +8:00),Eastern Standard Time(东部标准时间,EST,等于UTC - 05:00)。我们经常看到的是CST、EST等时区的缩写。
R中记录的时区
R使用国际标准IANA(Internet Assigned Numbers Authority数据库)时区,这个数据库命名时区采用一致的命名方式:<continent>/<city>(<大洲>/<城市>)。用城市而不用国家(country)的原因是:国家会分裂或灭亡,但城市的名字相对稳定。
OlsonNames()函数可以看R中的时区名字,可以看到大部分时区是用<continent>/<city>格式存储的,还有一些是类似UTC的时区的缩写。
> head(OlsonNames())
[1] "Africa/Abidjan" "Africa/Accra" "Africa/Addis_Ababa"
[4] "Africa/Algiers" "Africa/Asmara" "Africa/Asmera"
> tail(OlsonNames())
[1] "US/Pacific" "US/Samoa" "UTC" "W-SU" "WET"
[6] "Zulu"
时区是date-time的一个属性,在打印的时候会显示。R中与时区相关的参数tz设置的时候只能选择OlsonNames()中存储的值,但是打印的时候会显示对应的缩写。
# ymd_hms()等date-time函数的tz默认是UTC,标准世界时间
> (a<-ymd_hms("2015-06-01 12:00:00",tz="UTC"))
[1] "2015-06-01 12:00:00 UTC"
# tz="US/Alaska"打印后是AKDT,阿拉斯加夏令时
> (a<-ymd_hms("2015-06-01 12:00:00",tz="US/Alaska"))
[1] "2015-06-01 12:00:00 AKDT"
Sys.timezone()函数可以查看当前系统的时区:
> Sys.timezone()
[1] "Asia/Taipei"
用时区相关函数求两个时区时间的位移差
1) 求同一时间在不同时区的时间用with_tz()函数:
with_tz(time, tzone = "")
time:a POSIXct, POSIXlt, Date, chron date-time object or a data.frame object
tzone:设定时区
# now()函数的默认时区是系统默认时区,即北京是CST
> now()
[1] "2021-09-24 22:08:17.067588 CST"
# 对应“阿拉斯加夏令时”时区的时间
> with_tz(now(),tzone="US/Alaska")
[1] "2021-09-24 06:08:18.410664 AKDT"
想求一个时区与世界标准时间(UTC)的时间差,可以这样做:
1. 随便搞一个date-time
> (time<-ymd_hms("2021-01-01 0:0:0"))
[1] "2021-01-01 UTC"
2. 给一个你想看的时区
> with_tz(time,tzone = "Asia/Harbin")
[1] "2021-01-01 08:00:00 CST"
可以看到CST与UTC的时间偏移差是8小时
> with_tz(time,tzone = "US/Alaska")
[1] "2020-12-31 15:00:00 AKST"
AKST与UTC的时间偏移差是-9小时
2) 强制更改时区用force_tz()函数:
force_tz(time, tzone = "", roll = FALSE)
想求一个时区与世界标准时间(UTC)的时间差,也可以这样做:
1. 搞一个当前时区的date-time
> (x<-ymd_hms("2021-01-01 0:0:0",tz = "Asia/Harbin"))
[1] "2021-01-01 CST"
2. 强制将这个date-time改到UTC时区
> (y<-force_tz(x,tzone="UTC"))
[1] "2021-01-01 UTC"
3. 求差值
> y-x
Time difference of 8 hours
网友评论