首先要先對UTC、GMT、CST等時間概念有所了解
1 UTC(世界標準時間)
協調世界時,又稱世界標準時間或世界協調時間,簡稱UTC(從英文“Coordinated Universal Time”/法文“TempsUniversel Coordonné”而來),是主要的世界時間標準,其以原子時秒長為基礎,在時刻上盡量接近于格
林尼治標準時間。
2 GMT(格林尼治平時)
格林尼治平時(又稱格林尼治平均時間或格林尼治標準時間,舊譯格林威治標準時間;英語:Greenwich MeanTime,GMT)是指位于英國倫敦郊區的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那里的經線。
理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空高點時)的時間。由于地球在它的橢圓軌道里的運動速度不均勻,這個時刻可能與實際的太陽時有誤差,大誤差達16分鐘
。由于地球每天的自轉是有些不規則的,而且正在緩慢減速,因此格林尼治時間已經不再被作為標準時間使用。現在的標準時間,是由原子鐘報時的協調世界時(UTC)。
3 CST(北京時間)
北京時間,China Standard Time,中國標準時間。在時區劃分上,屬東八區,比協調世界時早8小時,記為UTC+8。不過這個CST這個縮寫比較糾結的是它可以同時代表四個不同的時間:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
基本概念:
GMT 和 UTC 可以互換,但是實際上,GMT 是一個時區,而 UTC 是一個時間標準。
ISO8601
國際標準化組織的國際標準ISO 8601是日期和時間的表示方法,全稱為《數據存儲和交換形式·信息交換·日期和時間的表示方法》。目前新為第三版ISO8601:2004,版為ISO8601:1988,第二版為ISO8601:2000。
日期和時間的組合表示法
日期和時間合并表示時,要在時間前面加一大寫字母T,如要表示北京時間2004年5月3日下午5點30分8秒,可以寫成2004-05-03T17:30:08+08:00或20040503T173008+08。
ISO8601與UTC的區別,其實兩者完全是兩個東西,通俗的說,iso8601是一種utc時間的表示方式而已。
本地時間 :UTC + (+0800) = 本地(北京)時間
時間戳 :時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數
時間字符串
我們先說復雜的時間字符串形式。它實際上支持兩種格式:一種是 RFC-2822 的標準;另一種是 ISO 8601 的標準。我們主要介紹后一種。
RFC-2822標準格式大致是:Wed Mar 25 2015 09:56:24 GMT+0100
ISO 8601標準格式大致是:2018-05-23T16:05:52.123+08:00
以下會用到三種時間字符串表示形式,時間格式:
2018-05-23T16:05:52.123+08:00 //"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
2018-05-24 00:05:52 //"yyyy-MM-dd HH:mm:ss"
Thu May 24 00:05:52 CST 2018 //"EEE MMM dd HH:mm:ss zzz yyyy"
ISO 8601
ISO 8601的標準格式是:YYYY-MM-DDTHH:mm:ss.sssZ,分別表示:
-
YYYY:年份,0000 ~ 9999
-
MM:月份,01 ~ 12
-
DD:日,01 ~ 31
-
T:分隔日期和時間
-
HH:小時,00 ~ 24
-
mm:分鐘,00 ~ 59
-
ss:秒,00 ~ 59
-
.sss:毫秒
-
Z:時區,可以是:Z(UFC)、+HH:mm、-HH:mm
這里我們主要來說下 T、以及 Z。
T
T 也可以用空格表示,但是這兩種表示有點不一樣,T 其實表示 UTC,而空格會被認為是本地時區(前提是不通過 Z 指定時區)。比如下面的例子:(轉換函數請拉倒底部)
-
String utcTime = "2018-05-23 16:05:52";
-
String utcTimePatten = "yyyy-MM-dd HH:mm:ss";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
-
-
Thu May 24 00:05:52 CST 2018
-
String utcTime = "2018-05-23T16:05:52";
-
String utcTimePatten = "yyyy-MM-dd'T'HH:mm:ss";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
-
-
Thu May 24 00:05:52 CST 2018
不加時區,不管日期與時間之間是空格還是T都會被認為是GMT時區,而本地時區為東八區,所以后轉換的時間會在原基礎上有8小時的偏移。2018-05-23T16:05:52和2018-05-23T16:05:52.000+00:00是等價的。
Z
Z 用來表示傳入時間的時區(zone),不指定并且沒有使用 T 分隔而是使用空格分隔時,就按GMT時區處理,比如下面的例子:
-
String utcTime = "2018-05-23 16:05:52 ";
-
String utcTimePatten = "yyyy-MM-dd HH:mm:ss";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
-
-
Thu May 24 00:05:52 CST 2018
-
沒有指定時區,默認為GMT時區,顯示的時間會加上本地時區的偏移(8 小時)
-
String utcTime = "2018-05-23T16:05:52.000+00:00";
-
String utcTimePatten = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
2018-05-23T16:05:52.000+00:00
-
-
Thu May 24 00:05:52 CST 2018
-
-
因為指定時區GMT時區(偏移為 0),顯示的時間會加上本地時區的偏移(8 小時)
-
String utcTime = "2018-05-23T16:05:52.000+08:00";
-
String utcTimePatten = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
2018-05-23T16:05:52.000+08:00
-
-
Wed May 23 16:05:52 CST 2018
-
-
東八區時間,顯示的時間和傳入的時間一致(因為我本地時區是東八區)。
將ISO8061格式的中的毫秒去掉,yyyy-MM-dd'T'HH:mm:ss.SSSXXX格式中的.SSS就是表示毫秒的意思
-
String utcTime = "2018-05-23T16:05:52+08:00";
-
String utcTimePatten = "yyyy-MM-dd'T'HH:mm:ssXXX";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
2018-05-23T16:05:52+08:00
-
-
Wed May 23 16:05:52 CST 2018
yyyy-MM-dd'T'HH:mm:ss.SSSXXX格式中的XXX表示時區,一個X表示+08,三個X表示+08:00
-
String utcTime = "2018-05-23T16:05:52+08:30";
-
String utcTimePatten = "yyyy-MM-dd'T'HH:mm:ssX";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
2018-05-23T16:05:52+08:30
-
-
Wed May 23 16:05:52 CST 2018
-
一個X只讀取了時區+08:30中的+08,而30卻別忽略了
-
-
String utcTime = "2018-05-23T16:05:52+08:30";
-
String utcTimePatten = "yyyy-MM-dd'T'HH:mm:ssXXX";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
2018-05-23T16:05:52+08:30
-
-
Wed May 23 15:35:52 CST 2018
-
三個X,時間在原有的基礎上又多了30分鐘,所以XXX表示的是+08:30,而X只表示+08
2018-05-23T16:05:52.123Z時間格式
-
String utcTime = "2018-05-23T16:05:52.123Z";
-
String utcTimePatten = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss";
-
-
-
-
Thu May 24 00:05:52 CST 2018
-
-
默認為GMT時區,顯示的時間會加上本地時區的偏移(8 小時)
完整代碼
-
import java.text.ParseException;
-
import java.text.ParsePosition;
-
import java.text.SimpleDateFormat;
-
-
import java.util.TimeZone;
-
-
-
public static void main(String[] arg) {
-
String utcTime = "2018-05-23T16:05:52.123+08:00";
-
String utcTimePatten = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
-
String localTimePatten = "yyyy-MM-dd HH:mm:ss.SSS";
-
System.out.println(utcTime);
-
System.out.println(utc2Local(utcTime,utcTimePatten, localTimePatten));
-
System.out.println(str2DateLong(utc2Local(utcTime,utcTimePatten, localTimePatten)));
-
-
-
public static Date str2DateLong(String strDate) {
-
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
ParsePosition pos = new ParsePosition(0);
-
Date strtodate = formatter.parse(strDate, pos);
-
-
-
-
-
-
-
-
-
-
-
-
public static String utc2Local(String utcTime, String utcTimePatten, String localTimePatten) {
-
SimpleDateFormat utcFormater = new SimpleDateFormat(utcTimePatten);
-
utcFormater.setTimeZone(TimeZone.getTimeZone("UTC"));
-
-
-
gpsUTCDate = utcFormater.parse(utcTime);
-
} catch (ParseException e) {
-
-
-
-
SimpleDateFormat localFormater = new SimpleDateFormat(localTimePatten);
-
localFormater.setTimeZone(TimeZone.getDefault());
-
String localTime = localFormater.format(gpsUTCDate.getTime());
-
-
-
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。