时间戳 : 从格林威治时间1970年01月01日00时00分00秒,到指定时间的总秒数.
1970年1月1日0时1分0秒的时间戳,用上述办法计算出是60
将60这个时间戳还原成时间就是1970年1月1日0时1分0秒.
//
1.由于世界各地的"时间"是不一样的,比如北京早上8点时,英国伦敦是半夜00点.
2.那么当地球处于时间1970年1月1日0时1分0秒时,北京的时间是1970年1月1日8时1分0秒.而伦敦的时间正好是1970年1月1日0时1分0秒
3.北京和伦敦时间相差的8小时是时间区域划分的结果.
4.时区划分:0度经线起,向东边每15度划分一个时区,时间依次累加1小时,向西边每15度划分一个时区,时间依次累减1小时.因为地球自西向东转,所以东边人先看到太阳,时间比西边人早.
时区范围是以划分点两侧各7.5度(即划分点平分时区范围).比如0度经线所在的时区范围是西经7.5度到东经7.5度 ,东经15度划分点的时区是东经7.5度到东经22.5度
5.北京天安门在东经116度,是处于东经120度划分点的范围,那么每东经15度加1小时,走过120度正好加了8小时.120/15=8.
6.由此得出第2条描述的结论.为什么0经度要定在伦敦呢,又为什么要东加西减15度一划分呢,这是天文学家开会讨论后定下的.
7.时间戳60这个时间其实是一个"绝对时间",与人习惯的这种太阳在中午12点升得最高,这个12点不是一回事.但是它们之间是有关联的,可以由"绝对时间"推算出本地时间,关联逻辑就是4条所描述的时区划分.
8.那么要得到60时间戳所对应的本地时间(所在时区的时间),公式就是用这个时间加或者减所在地的时区
城市 | 经度 | 时区划分点 | 时间戳 | 时间戳时间 | 时区时间 | 本地时间 |
伦敦 |
西经0 | 西经0 | 60 |
1970年1月1日0时1分0秒 | -0 | 1970-1-1 0点1:0 |
北京 | 东经116 | 东经120 | 60 | 1970年1月1日0时1分0秒 | +8 | 1970-1-1 8点1:0 |
柏林 | 东经13 | 东经15 | 60 | 1970年1月1日0时1分0秒 | +1 | 1970-1-1 1点1:0 |
华盛顿 | 西经77 | 西经75 | 60 | 1970年1月1日0时1分0秒 | -5 | 1969-12-31 19点1:0 |
东京 | 东经139 | 东经135 | 60 | 1970年1月1日0时1分0秒 | +9 | 1970-1-1 9点1:0 |
9.如何计算某个时区的本地时间的时间戳?
地球上不同时区在同一刻的时间戳一样.也就是上表中,北京时间1970-1-1 8点1:0,华盛顿时间1969-12-31 19点1:0 其实是处在同一时间,时间戳计算出来都是60.
如果用那种"减去1970-1-1 0:0:0"这一时间"起点"的做法,那么在北京会得出8*60*60=28800 华盛顿会得出-5*60*60=-18000,不会是60(在伦敦得出的是60)
时间戳规定时间起点是1970-1-1 0:0:0这一秒,而这个时间是当时伦敦时间.那么在伦敦(0时区)这样计算是没问题的,到别的时区时,需要先将它换成所在时区的时间.
那么伦敦在1970-1-1 0:0:0时,北京是在1970-1-1 8:0:0,所以这个时间就是在北京的时间起点,要计算北京本地某个时间的时间戳,应当以这个时间点为起点.
10.C#关于时间戳计算用到的类和方法:
// 计时时间戳首先得到当前时区的时间起点
DateTime startTime=TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
// 将需要计算的本地时间与起点相减,得到秒数
DateTime dtNow = new DateTime(1970, 1, 1, 8, 1, 0);// 计算这个时间的时间戳
TimeSpan toNow = dtNow.Subtract(startTime);// 相减得到时间间隔
long t = (long)toNow.TotalSeconds;// 转为秒(就是时间戳)
// 用时间戳得到时间,首先也需要得到当前时区的时间起点,然后用这个起点加上时间戳
long timestamp=60;// 时间戳是秒为单位
TimeSpan t = new TimeSpan(timestamp * 1000*1000*10);// 转为时间间隔,参数是100纳秒为单位的时间段
DateTime dt = startTime.Add(t);// 起点加上时间戳得到时间