时间的故事 续篇

前端之家收集整理的这篇文章主要介绍了时间的故事 续篇前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

#关于时间,你真的都懂吗? 《续篇》 上一篇,开篇介绍了关于时间标准的定义,假如你能看到这里来,说明你是个渴望学知识的青年,至少还是能耐得住性子来学习的,这一篇将将分两个小节来介绍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

猜你在找的Go相关文章