#关于时间,你真的都懂吗? 《续篇》 上一篇,开篇介绍了关于时间标准的定义,假如你能看到这里来,说明你是个渴望学知识的青年,至少还是能耐得住性子来学习的,这一篇将将分两个小节来介绍java编程语言和golang语言在处理时间具体问题上面是怎么处理的,为什么选择这两门语言,篇尾揭晓答案。
###java版时间处理 java处理时间并不复杂,我要介绍的知识是处理的时候相关细节,java平台提供给我们操作日期基本涉及如下几个类:
1.Calender
日历类,主要描述时间单位,例如年月日,时分秒,星期几,一年的第几周,注意这个是个抽象类,可能大多数开发人员没有太在意,下面将用代码详细描述。
2. Date
日期类,主要描述时间变化,目前通行的方案是相当于unix 1970年1月1号 0时0分0秒时间的偏移豪秒数,作为时间推进的,定义时间的参考点,换句话来说,我们现在的日期都是计算机系统里面描述的时间,都是以这个为基准点,往后推进多少毫秒数,时间就往后推进多长时间,计算的标准方程式也很简单.
time/1000 相当于 过了多少秒; time/(60*1000) 相当于过了多少分钟,依次类推。
3. TimeZone
时区类,用于描述时间所处的时区,同一个时间,在世界不同时区,时间值不同;所以我们说时间,通常要带上具体是哪个地区时间,当然如果生活在一个地方,大家习以为常的省略了时区, 比如China 时区信息就是GMT+8 , 国际通行的格式是GMT+08:00 ,这个很重要,有些地方描述格式不一致,导致在很多地方,比如有些地方GMT+5 跨越半个时区,这样假如你用GMT+5.5来标示,国际上可是不认可的,正确的表达格式是GMT+5:30.
另外对于时区信息,不同城市有着自己特有的描述,方便在不同城市中活动的时候来准确描述时间信息,单纯地说GMT+0x:00或者GMT-0x:00,不是那么形象,比如洛杉矶时间、纽约时间、中国香港时间,巴黎时间,伦敦时间等,这些时间表达式在不考虑冬令时夏令时的情况下,基本和GMT时间存在一一对应关系。
America/Los_Angeles 洛杉矶时间 GMT-05:00 China/chongqing 重庆时间 GMT+08:00 China/shanghai 上海时间 GMT+08:00 Pacific/Auckland 奥克兰时间 GMT+12:00
4. SimpleDateFormat
日期格式化类,用于描述时间的格式,对于不同国家阅读习惯,时间格式不尽相同,最大的不同体现在年月日的格式上 ,yyyy/MM/dd 标示“年月日” 或者 dd/MM/yyyy 标示“日月年”, 年月日,以及24小时制,java约定一套占位符,按照格式来输出对应的。
Calendar defaultDalendar = Calendar.getInstance(); // 通过操作系统配置的时区信息来初始化日期 Calendar calendarByTimeZone = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); //通过时区来初始化日历 Calendar calendarByZoneId = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));//通过时区ID初始化日期
###golang版 golang 处理日期就比较简单,没有那么类配置,这就是面向对象和函数不同表达 ,api简洁,不多说,看代码就懂,不同的是 对于时间表达式,有些怪怪的。
####时间格式化
“2006-01-02 15:04:05是golang的对于时间的Format的Layout”,。请看下表:
01/Jan | 02 | 03/15 | 04 | 05 | 06 | -07[00][:00] | PM | Mon |
---|---|---|---|---|---|---|---|---|
月 | 日 | 时 | 分 | 秒 | 年 | 时差 | 上下午 | 星期几 |
03/15 分别表示 12小时制/24小时制
-
就是123456 : 月日时分秒年
-
7 表示 时差
-
PM/AM 表示上下午
-
Mon 表示星期几
layout:="2006-01-02 15:04:05" now := time.Now() local1,err1 := time.LoadLocation("UTC") //等同于"UTC" if err1 != nil { fmt.Println(err1) } local2,err2 := time.LoadLocation("Local")//从默认ZONEINFO 加载时区配置 if err2 != nil { fmt.Println(err2) } local3,err3 := time.LoadLocation("America/Los_Angeles") if err3 != nil { fmt.Println(err3) } fmt.Println(now.In(local1).Format(layout)) fmt.Println(now.In(local2).Format(layout)) fmt.Println(now.In(local3).Format(layout))
###篇尾 重点关注
在java中,按照时区来做日期转换的时候,比如GMT+08:00转GMT-05:00 时间可以直接用时间的偏移量(13个小时)来计算,不过还是强调一点,当出现夏令时,冬令时的时候,这一套计算方法的无效了,需要通过时区ID 来计算,比如"China/shanghai", "America/Los_Angeles" 来做转换,具体怎么转换这个api文档。
在golang中, 按照时区来做时间转换的时候,比如GMT+08:00转GMT-05:00 直接就是行不通的,执行会报错,当让我不知道是不是我了解的还不够透彻,我的理解是golang本身就不认可这种方式来处理时间,更加,更倾向于通过时区ID 来计算,比如"China/shanghai","America/Los_Angeles" 来做转换。
代码如下:
//当前时间 2017-01-01 01:01:01 转成洛杉矶时间 local,_ := time.LoadLocation("America/Los_Angeles") targetTime,_:= time.Parse(layout,"2017-01-01 01:01:01") fmt.Println(targetTime.In(local).Format(layout))
知识,技术就讲到这里为止,再讲细节,这里面涉及到java 的时区信息包的更新工具,golang 更新时区报的,三篇绝对讲不完,所以尾篇,我将就时间的说说自己的感想,鸡汤也好,毒药也罢,总归算是一份感悟,倘若你是一个刚入职场的菜鸟,愿意看完这个系列完结篇,算是有始有终;假如你已经在职场打拼多年,在我要说的故事里,能看到你些许曾经的影子,也算是回忆曾经走过的日子。
原文链接:https://www.f2er.com/go/188929.html