作者 | 曹建

责编 | 屠敏

出品 | 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-12SimpleDateFormat 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:40String 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链游玩家需求调研报告》重磅发布!

你点的每一个在看,我认真当成了喜欢

猛戳“阅读原文”,填写中国远程办公-调查问卷

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

  1. 在SQL server中设置时间格式

    在SQL server中设置时间格式 2008-01-13 12:21:02 今天在vs中更新sqlserver,却发现我vs中是当前时间,insert到数据库中却变成了1905年,搞了半天,原来是s ...

  2. 在PHP代码中处理JSON 格式的字符串的两种方法:

    总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...

  3. java中各种时间格式的转化

    http://www.chinaitpower.com/A/2005-01-14/104881.html 使用java.util.Calendar返回间隔天数         static int g ...

  4. ?请问怎样将excel表格中的时间格式读取为字符串格式?

    ?请问怎样将excel表格中的时间格式读取为字符串格式? Delphi / Windows SDK/API http://www.delphi2007.net/DelphiNetwork/html/d ...

  5. 语言 全排列 函数_Power Query 中日期时间格式转换需要了解的区域语言对照表

    不同的国家有不同的日期时间书写格式,比如: 多数亚洲国家:yyyy-MM-dd hh:mm 有些欧洲国家:dd.MM.yyyy HH:mm 极少数的国家:MM/dd/yyyy h:mm tt 还有各种 ...

  6. JAVA中通过时间格式来生成唯一的文件名

    有时候我们需要截图,在要截图时,有人用到了时间格式,但是时间格式中的:在文件名称中是不被允许的字符,所以就会报错,如何生成唯一的时间文件名: package com.demo;import java. ...

  7. python中设置时间格式--模块datetime中日期和时间格式的参数

    模块datetime中设置日期和时间格式的实参 实参 含义 %A 本地完整星期名称 %a 本地简化星期名称 %B 本地完整的月份名称 %b 本地简化的月份名称 %m(month的首字母) 用数字表示的 ...

  8. Java 中验证时间格式的 4 种方法

    大家好,今天咱们来讲一下,Java 中如何检查一个字符串是否是合法的日期格式? 为什么要检查时间格式? 后端接口在接收数据的时候,都需要进行检查.检查全部通过后,才能够执行业务逻辑.对于时间格式,我们 ...

  9. Postgre SQL 中的时间格式

    我的其他文章 亲身分享 一次 字节跳动 真实面试经历和面试题 时间格式 时间单位: year :年 week :该天在所在的年份里是第几周 timezone_minute:时区偏移量的分钟部分 tim ...

最新文章

  1. day8 动态导入模块、socket进阶
  2. 批处理解决本地连接无法禁用问题
  3. 第七届杭州云栖大会召开 阿里云在人工智能领域发力
  4. 把Qt的界面文件(.ui文件)生成源文件(.h或.cpp)封装成链接库
  5. netty worker线程数量_Dubbo线程模型
  6. NodeJs局域网开启服务
  7. Shell中判断文件,目录是否存在
  8. Oracle ora-15070,查询字段过多触发了Oracle的BUG?【ORA-01465: 无效的十六进制数字】...
  9. windows xp下 usb驱动编写
  10. java面试之自我介绍
  11. TCR+fc型svc无功补偿仿真模型有详细资料
  12. 安装AmaterasUML插件和GEF插件的详细步骤
  13. Maxscript基本数据类型(二):Name
  14. 【电气专业知识问答】问:电动机的电气性能有什么要求?
  15. 设计模式之里氏替换原则
  16. 一次小米路由器3刷机的翻车记录
  17. 【js特效】www.zhen.com图片频道页特效
  18. I2C知识大全系列三 —— I2C驱动之单片机中的I2C
  19. 新闻文本分类--任务5 基于深度学习的文本分类2
  20. 对3维向量及3维张量关系的思考

热门文章

  1. mysql无法启动服务,错误1067
  2. 解决页面textarea初始焦点显示位置不正确的问题
  3. SQL Server 索引列的顺序——真的没关系吗
  4. Learning SQL--多表查询
  5. div+css 固定宽度且居中 文字左对齐
  6. 【手把手带你入门深度学习之150行代码的汉字识别系统】学习笔记 ·001 用OpenCV制作数据集
  7. QBoxLayout中setSpacing(int)和addSpacing(int)的区别
  8. 音乐怎么生成html,如何制作自己喜欢的DJ舞曲(教你玩转音乐制作)
  9. C++ .template 关键字
  10. Zookeeper启动和Leader选举机制