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 与北京时间之间的相互转换,可以极大的提高我们的开发效率。