代码中的时间格式问题究竟该如何处理?

2020 年 2 月 21 日 CSDN

作者 | 曹建
责编 | 屠敏
出品 | CSDN(ID:CSDNnews)
全世界按经度划分为24个时区,每区经度15°,有零时区、东西各11个时区和12个时区。 各时区使用其中央经线的地方平时为时区时间。 我们生活中采用的时间是东八区时间, 东八区(UTC / GMT+08:00)是比世界协调时间(UTC)/ 格林尼治标准时间(GMT)快8小时的时区,理论上的位置是位于东经112.5度至127.5度之间,是东盟标准的其中一个候选时区。 当格林尼治标准时间为0:00时,东八区的标准时间为08:00 ,也就北京时间。 北京时间采用的是距离北京以东约340公里处的地方时间。 北京时间使用东八区的区时,而非东八区由北京时间授时。 北京时间是中国行政管理、生产、交通运输等工作的时间计量标准。
GMT,即格林尼治标准时间,也就是世界时。 格林尼治是英国伦敦南郊原皇家格林尼治天文台所在地,地球本初子午线的标界处,世界计算时间和经度的起点。 以其海事历史、作为本初子午线的标准点、以及格林尼治时间以其命名而闻名于世。 GMT的正午是指当太阳横穿格林尼治子午线(本初子午线)时的时间。 但由于地球自转不均匀不规则,导致GMT时间不精确,现在已经不再作为世界标准世界使用。  

UTC,英文名 Coordinated Universal Time ,即协调世界时,UTC是以原子时秒长为基础,在时刻上尽量接近于GMT的一种时间计量系统。国际原子时的准确度为每日数纳秒,而世界时的准确度为每日数毫秒。对于这种情况,一种称为协调世界时的折衷时标于1972年面世。为确保UTC与GMT相差不会超过0.9秒,在有需要的情况下会在UTC内加上正或负闰秒。UTC现在作为世界标准时间使用。所以,UTC 与 GMT 基本上等同,误差不差过0.9秒。

当在程序开发过程当中,使用一些国外封装的前台插件或做一些国际化的功能时,经常会用到世界协调时间(UTC)或格林尼治时间(GMT)。

作为一个中国的程序员,我们都会将时间转换为北京时间,以便进行逻辑处理和显示。我们经常看到或用到的时间格式是如2019-10-14 21:30:03这样的时间格式,但UTC的时间格式并非我们上面经常看到的那样时间格式,那UTC时间格式有哪些呢,以及如何进行格式转换呢,下面分别示例展示如何转换:

(1) UTC第一种时间格式:2020-01-01T21:30:03+08:00,中间的T标识时间,+08:00为标识东八区时间,其解析转换过程如下:

public static void main(String[] args) {

try {

            String dateTime = "2020-01-01T21:30:03+08:00";

            SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+08:00");

            Date date= dateformat.parse(dataTime);

        } catch (ParseException e) {

            e.printStackTrace();

        }

}

上面示例中的时间是带有时区标识的时间格式,其还有一种转换方法,也可以转换为正常的 Date 类型的日期格式,示例如下:

public static void main(String[] args) {

try {

        String dateTime = "2020-01-01T21:30:03+08:00";

        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX:00");

        Date date= dateformat.parse(dataTime);

    } catch (ParseException e) {

        e.printStackTrace();

    }

}

(2) 第二种时间格式:2019-10-14T13:41:45.223Z,类似这种时间格式进行时间格式转换。 在军事中,协调世界时区会使用“Z”来表示。又由于Z在无线电联络中使用“Zulu”作代称,协调世界时也会被称为"Zulu time"。Z前面的三个数字表示毫秒。 

public static void main(String[] args) {

    try {

        String dateTime = "2019-10-14T13:41:45.223Z";

        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

        Date date= dateformat.parse(dataTime);

    } catch (ParseException e) {

        e.printStackTrace();

    }

上面示例中的时间格式还有一种转换方法,也可以转换为正常的 Date 类型的日期格式,示例如下:

public static void main(String[] args) {

    try {

        String dateTime = "2019-10-14T13:41:45.223Z";

        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.ms'Z'");

        Date date= dateformat.parse(dataTime);

    } catch (ParseException e) {

        e.printStackTrace();

    }

 } 

(3) 第三种时间格式: Sat Oct 12 2019 14:19:40 GMT 0800 (中国标准时间),该时间是格林尼治时间格式的时间。对于这种格式,我们都可以认的出来,但很多时候并不知道如何将其转化为我们常用的Date类型的时间格式,可采用下面的方法进行转换。

public static void main(String[] args) {

    try {

        String dataTime = "Sat Oct 12 2019 14:19:40 GMT+0800 (中国标准时间)";

        // 该pattern中的 E 标识星期,MMM标识月份

        String data = dataTime.replace("GMT""").replaceAll("\\(.*\\)""");

        // 将字符串转化为date类型,格式2016-10-12

        SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy hh:mm:ss z", Locale.ENGLISH);

        Date dateTrans = format.parse(data);

        SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 将其转化解析可的日期为:2019-10-12 14:19:40

        String beijingTimeStr = formatDate.format(dateTrans);            

    } catch (ParseException e) {

        e.printStackTrace();

    }

 } 

还有一种和上面时间格式类似的时间格式,同样可进行时间转换,也可以指定某时间进行时间格式转换。

示例如下:

public static void main(String[] args) {

    try {

        // 和上面的时间格式相比少了 + 号

        String dataTime = "Sat Oct 12 2019 14:19:40 GMT 0800 (中国标准时间)";

        // 该pattern中的 E 标识星期,MMM标识月份

        SimpleDateFormat dateformat = new SimpleDateFormat("E MMM dd yyyy HH:mm:ss z", Locale.ENGLISH);

        // 此处解析获得的时间为伦敦时间,即格林尼治时间,若获取北京时间还需要加8个小时

        Date date= dateformat.parse(dataTime);

    } catch (ParseException e) {

        e.printStackTrace();

    }

 } 

上面的示例中采用 Locale指定时区,进行时区之间的时间转换。 Locale 表示地区,每一个Locale对象都代表了一个特定的地理、政治和文化地区。在操作 Date, Calendar等表示日期/时间的对象时,经常会用到;因为不同的区域,时间表示方式都不同。 同理,也可以指定其他时区进行时间转换。如 CHINA,JAP,UK, FRENCH 等等。

UTC 和 GMT 在我们开发的过程中经常会遇到,尤其是做一些国际化功能的时候。因为应用的程序和功能需要考虑在不同的时区进行运行,掌握UTC ,GMT 与北京时间之间的相互转换,可以极大的提高我们的开发效率。

【End】

推荐阅读 
复制粘贴发明人、Java 和互联网创建者相继去世,向初代互联网大佬致敬!
远程办公、游戏迅猛增长,旅行、汽车业遭重创!疫期移动互联网行业报告解读
CNN vs RNN vs ANN——3种神经网络分析模型,你pick谁?
31岁年薪50万:“复工第一天,谢谢裁掉我!” 有底气的人生无需解释!
一文读懂Docker及其对系统管理员的重要性
男性玩家占78.8%、90后玩家占近50%、最多人选择中国风链游……《2019链游玩家需求调研报告》重磅发布!
你点的每一个在看,我认真当成了喜欢


猛戳“ 阅读原文 ”,填写中国远程办公-调查问卷
登录查看更多
0

相关内容

DATE:Design, Automation & Test in Europe。 Explanation:欧洲的设计、自动化和测试。 Publisher:IEEE/ACM。 SIT: http://dblp.uni-trier.de/db/conf/date/
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
少标签数据学习,54页ppt
专知会员服务
194+阅读 · 2020年5月22日
【高能所】如何做好⼀份学术报告& 简单介绍LaTeX 的使用
【CVPR2020】视觉推理-可微自适应计算时间
专知会员服务
12+阅读 · 2020年4月28日
机器学习速查手册,135页pdf
专知会员服务
336+阅读 · 2020年3月15日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
189+阅读 · 2020年3月12日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
173+阅读 · 2020年1月1日
【新书】Python中的经典计算机科学问题,224页PDF
专知会员服务
51+阅读 · 2019年12月31日
如何做数据治理?
智能交通技术
15+阅读 · 2019年4月20日
你真的会正确地调试 TensorFlow 代码吗?
数据库开发
7+阅读 · 2019年3月18日
机器学习中如何处理不平衡数据?
机器之心
13+阅读 · 2019年2月17日
已删除
AI科技评论
4+阅读 · 2018年8月12日
深度学习入门必须理解这25个概念
AI100
7+阅读 · 2018年6月6日
干货 | 自然语言处理(5)之英文文本挖掘预处理流程
机器学习算法与Python学习
7+阅读 · 2018年4月5日
教你用Python进行自然语言处理(附代码)
数据派THU
6+阅读 · 2018年3月28日
一文学会最常见的10种NLP处理技术(附资源&代码)
如何七周成为数据分析师
R语言中文社区
4+阅读 · 2017年7月19日
Arxiv
7+阅读 · 2020年3月1日
Arxiv
6+阅读 · 2018年5月22日
Arxiv
5+阅读 · 2018年5月1日
Arxiv
4+阅读 · 2018年2月13日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
少标签数据学习,54页ppt
专知会员服务
194+阅读 · 2020年5月22日
【高能所】如何做好⼀份学术报告& 简单介绍LaTeX 的使用
【CVPR2020】视觉推理-可微自适应计算时间
专知会员服务
12+阅读 · 2020年4月28日
机器学习速查手册,135页pdf
专知会员服务
336+阅读 · 2020年3月15日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
189+阅读 · 2020年3月12日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
173+阅读 · 2020年1月1日
【新书】Python中的经典计算机科学问题,224页PDF
专知会员服务
51+阅读 · 2019年12月31日
相关资讯
如何做数据治理?
智能交通技术
15+阅读 · 2019年4月20日
你真的会正确地调试 TensorFlow 代码吗?
数据库开发
7+阅读 · 2019年3月18日
机器学习中如何处理不平衡数据?
机器之心
13+阅读 · 2019年2月17日
已删除
AI科技评论
4+阅读 · 2018年8月12日
深度学习入门必须理解这25个概念
AI100
7+阅读 · 2018年6月6日
干货 | 自然语言处理(5)之英文文本挖掘预处理流程
机器学习算法与Python学习
7+阅读 · 2018年4月5日
教你用Python进行自然语言处理(附代码)
数据派THU
6+阅读 · 2018年3月28日
一文学会最常见的10种NLP处理技术(附资源&代码)
如何七周成为数据分析师
R语言中文社区
4+阅读 · 2017年7月19日
Top
微信扫码咨询专知VIP会员