文档章节

时间的故事 续篇

demon
 demon
发布于 2017/02/12 15:03
字数 1499
阅读 29
收藏 0

#关于时间,你真的都懂吗? 《续篇》 上一篇,开篇介绍了关于时间标准的定义,假如你能看到这里来,说明你是个渴望学知识的青年,至少还是能耐得住性子来学习的,这一篇将将分两个小节来介绍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 更新时区报的,三篇绝对讲不完,所以尾篇,我将就时间的说说自己的感想,鸡汤也好,毒药也罢,总归算是一份感悟,倘若你是一个刚入职场的菜鸟,愿意看完这个系列完结篇,算是有始有终;假如你已经在职场打拼多年,在我要说的故事里,能看到你些许曾经的影子,也算是回忆曾经走过的日子。

© 著作权归作者所有

上一篇: 时间的故事 尾篇
下一篇: 时间的故事
demon
粉丝 7
博文 3
码字总数 4666
作品 1
武汉
项目经理
私信 提问
从零开始(1)

这里是从零开始的起点 开续篇了之2 点击进入续篇 点击进入续篇 点击进入续篇 ( 100 ) 一个鸡肋的View旋转 详情请点击此处 ( 99 ) a simple and old Switch 详情请点击此处 ( 98 ) Swift和OC如...

阴雨音语
2016/03/05
238
0
ExtJS4.2学习(20)动态数据表格之前几章总结篇1

本节采用技术:SpringMVC+Jetty+ExtJs4.2+Maven+MySQL5.1以上+SLF4J(前几节学习的大家不知道记住了没,现在来总结复习下,顺便加点新技术) 学习本节前的准备:Eclipse高版本,Jetty插件,M...

shyy8712872
2014/05/08
0
0
斯坦福ML公开课笔记13B-因子分析模型及其EM求解

转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/37559995 本文是《斯坦福ML公开课笔记13A》的续篇。主要讲述针对混合高斯模型的问题所采取的简单解决方法,即对假设进行限制的...

xinzhangyanxiang
2014/07/08
0
0
从零开始,直到···

温馨提示: 开续篇了 点击进入续篇 点击进入续篇 点击进入续篇 ( 43 ) 释放/销毁 //释放所有子控件 [<#控件#>.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; ( 42 ...

阴雨音语
2016/01/20
757
0
再续:12306 火车售票系统的仓储引擎设计

本文是前两篇文章的续篇,继续研讨12306网站特殊仓储结构的售票引擎设计。 前文请看:12306 售票仓储结构的设计 续篇:续篇:12306 火车售票系统的仓储结构设计 关于大并发时系统处理能力的问...

八风不动
2014/01/27
1K
7

没有更多内容

加载失败,请刷新页面

加载更多

JS 打印控制

JS 打印控制 var PrintStartString = "<!--打印开始标示符-->";//设置打印开始区域var PrintEndString = "<!--打印结束标示符-->";//设置打印结束区域var HtmlText = window.do......

DrChenXX
3分钟前
4
0
LevelDB:使用介绍

LevelDB 提供的接口其实很简单,下面举例进行简单说明。 安装 git clone https://github.com/google/leveldb cd leveldb mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. ......

slagga
8分钟前
4
0
《JavaScript正则表达式迷你书》读书笔记

正则基础 常见简写形式 字符组 具体含义 记忆方式 \d 表示 [0-9]。表示是一位数字。 其英文是 digit(数字) \D 表示 [^0-9]。表示除数字外的任意字符。 \w 表示 [0-9a-zA-Z_]。表示数字、大小...

muzi131313
13分钟前
2
0
Git的反悔操作

概述 这次主要来讲讲Git的反悔操作,自己平时在写代码的过程中经常会出现想要弃用所有的改动或回滚到上一次commit的情况。Git上的反悔操作有reset、rebase、revert等,每个操作各有区别和对应...

duduYZ
13分钟前
2
0
实现双向绑定Proxy比defineproperty优劣如何?

前言 双向绑定其实已经是一个老掉牙的问题了,只要涉及到MVVM框架就不得不谈的知识点,但它毕竟是Vue的三要素之一. Vue三要素 响应式: 例如如何监听数据变化,其中的实现方法就是我们提到的双向...

寻找海蓝
25分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部