java 获取utc格式的时间_代码中的时间格式问题究竟该如何处理?

984c43895b8cd1827fb38edd8dbe9e71.gif

72c1f4eeed5357f38c2f958d58835991.png

作者 | 曹建 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 全世界按经度划分为24个时区,每区经度15°,有零时区、东西各11个时区和12个时区。 各时区使用其中央经线的地方平时为时区时间。 我们生活中采用的时间是东八区时间, 东八区(UTC / GMT+08:00)是比世界协调时间(UTC)/ 格林尼治标准时间(GMT)快8小时的时区,理论上的位置是位于东经112.5度至127.5度之间,是东盟标准的其中一个候选时区。 当格林尼治标准时间为0:00时,东八区的标准时间为08:00 ,也就北京时间。 北京时间采用的是距离北京以东约340公里处的地方时间。 北京时间使用东八区的区时,而非东八区由北京时间授时。 北京时间是中国行政管理、生产、交通运输等工作的时间计量标准。 ad08ce7d2eec9523f9ba8252e649fe7d.png 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】

322cbcc11b8556dff04f23610c5e9687.png

推荐阅读  ☞复制粘贴发明人、Java 和互联网创建者相继去世,向初代互联网大佬致敬! ☞远程办公、游戏迅猛增长,旅行、汽车业遭重创!疫期移动互联网行业报告解读☞CNN vs RNN vs ANN——3种神经网络分析模型,你pick谁? ☞31岁年薪50万:“复工第一天,谢谢裁掉我!” 有底气的人生无需解释! ☞一文读懂Docker及其对系统管理员的重要性☞男性玩家占78.8%、90后玩家占近50%、最多人选择中国风链游……《2019链游玩家需求调研报告》重磅发布! 3ade15b18fb897c4f55baf7e1d36dd84.png 你点的每一个在看,我认真当成了喜欢 猛戳“ ”,填写中国远程办公-调查问卷
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页