題外話,祝各位程序猿們中秋佳節快樂~~~O(∩_∩)O~。 ##追本溯源 ###歷史html
####GMT 百度百科:格林威治時間 ####UTC 百度百科:協調世界時java
二者比較:mysql
GMT:最初確立的世界標準時間,名字由來是由於英國的皇家格林尼治天文臺而得名,由於本初子午線被定義在經過那裏的經線。自1924年2月5日開始,格林尼治天文臺每隔一小時會向全世界發放調時信息。因爲地球天天的自轉是有些不規則的,並且正在緩慢減速,所以,格林尼治時間已經再也不被做爲標準時間使用。新的標準時間,是由原子鐘報時的協調世界時(UTC)。--百度百科linux
UTC:是目前使用的世界標準時間,其以原子時秒長爲基礎,在時刻上儘可能接近於格林尼治平時。國際原子時的偏差爲每日數納秒,而世界時的偏差爲每日數毫秒。對於這種狀況,一種稱爲協調世界時的折衷時標於1972年面世。爲確保協調世界時與世界時相差不會超過0.9秒,在有須要的狀況下會在協調世界時內加上正或負閏秒。所以協調世界時與國際原子時之間會出現若干整數秒的差異。位於巴黎的國際地球自轉事務中央局負責決定什麼時候加入閏秒。 --維基百科sql
這裏要提下有趣的事情是,由於UTC閏秒的緣故,java中的秒可能爲60或61,但java文檔中有說這個是依據計算機的環境,沒法保證準確性囧。 根據這兩個比較,GMT和UTC在正常生活中能夠指同一個時間,除非你作的東西對時間的準確性極爲敏感。數據庫
###一些重要概念: ####時區 1884年國際經線會議規定,全球按經度分爲24個時區,每區各佔經度15°。 以本初子午線爲中央經線的時區爲零時區,由零時區向東、西各分12區,東、西12區都是半時區,共同使用180°經線的地方時。編程
####CST :China Standard Time UTC+8:00 中國標準時間(北京時間),在東八區 俺們這塊的時區就是 UTC +8 ,至關於咱們國家的使用的時間比世界協調時間快了8小時。api
####unix時間戳 是從1970年1月1日(UTC/GMT的午夜)開始所通過的秒數,不考慮閏秒。 這裏在放一個連接,關於爲何都要從1970年算起,之前也真是懶的思考這個問題,拿來就用,之後真的須要作什麼事情都先問個爲何了。O(∩_∩)O哈哈~ 計算機時間、unix時間、linux時間、java時間爲什麼以1970年1月1日爲原點?從1970年1月1日開始計算? 百度百科:unix時間戳網絡
##java中使用 ###時間類 timeStamp date Calendarui
long millisTime = System.currentTimeMillis(); Timestamp timestamp = new Timestamp(millisTime); Time time = new Time(millisTime); Date date = new Date(millisTime); Calendar calendar = Calendar.getInstance(); System.out.println(time.getTime()); System.out.println(date.getTime()); System.out.println(timestamp.getTime()); System.out.println(calendar.getTimeInMillis());
以上構建以後,輸出的都是一樣的值,由於前三個是返回是距離January 1, 1970, 00:00:00 GMT的毫秒,而calendar
返回的是the current time as UTC milliseconds from the epoch。上面說了GMT和UTC能夠當作指同一個時間。因此值就是同樣的了。通常網絡通訊傳輸時間都是先轉成毫秒以後再轉回來,由於這裏面不會包含時區,這樣纔是準確的。
在java程序中通常都會使用Calendar
由於其餘幾個類裏面的方法幾乎都不建議使用了,Calendar
中提供了豐富的api,各位程序猿們使用的時候能夠自行查找。
Calendar calendar = Calendar.getInstance(); //獲取全部時區信息 TimeZone.getAvailableIDs(); //設置一個時區 calendar.setTimeZone(TimeZone.getTimeZone("GMT+13")); //打印該時區目前小時時間,24制 System.out.println(calendar.get(calendar.HOUR_OF_DAY));
###格式化時間顯示類SimpleDateFormat
順帶再提下Java的SimpleDateFormat
類,用來把時間格式化顯示的,顯示的樣式很豐富,看下列表格列舉的。
Letter | Date or Time Component | Presentation | Examples |
---|---|---|---|
G | Era designator | Text | AD |
y | Year | Year | 1996; 96 |
M | Month in year | Month | July; Jul; 07 |
w | Week in year | Number | 27 |
W | Week in month | Number | 2 |
D | Day in year | Number | 189 |
d | Day in month | Number | 10 |
F | Day of week in month | Number | 2 |
E | Day in week | Text | Tuesday; Tue |
a | Am/pm marker | Text | PM |
H | Hour in day (0-23) | Number | 0 |
k | Hour in day (1-24) | Number | 24 |
K | Hour in am/pm (0-11) | Number | 0 |
h | Hour in am/pm (1-12) | Number | 12 |
m | Minute in hour | Number | 30 |
s | Second in minute | Number | 55 |
S | Millisecond | Number | 978 |
z | Time zone | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | Time zone | RFC 822 time zone | -0800 |
下面這個方法是我在這裏How to convert a String to a Date using SimpleDateFormat?看到的。 相比慣例的格式化時間方法,是把每種格式類型都定義好以後再用分別的方法調用,這個寫成了一個統一的方法,雖然效率上沒有改進,可是這種寫法仍是對可閱讀性有了很多的提升啊。
/** * Format a time from a given format to given target format * * @param inputFormat * @param inputTimeStamp * @param outputFormat * @return * @throws ParseException */ private static String TimeStampConverter(final String inputFormat, String inputTimeStamp, final String outputFormat) throws ParseException { return new SimpleDateFormat(outputFormat).format(new SimpleDateFormat( inputFormat).parse(inputTimeStamp)); }
##頭痛的mysql中時間的使用
###各有千秋 咱們來一一介紹下mysql中的時間, DATE 顯示的格式爲YYYY-MM-DD
範圍從 '1000-01-01' 到 '9999-12-31' 佔用3個字節
DATETIME 顯示的格式爲YYYY-MM-DD HH:MM:SS
範圍從'1000-01-01 00:00:00' 到'9999-12-31 23:59:59' 佔用8個字節
TIMESTAMP 顯示的格式YYYY-MM-DD HH:MM:SS
範圍從'1970-01-01 00:00:01'到 '2038-01-19 03:14:07' 佔用4個字節 相信各位若是讀了上面unix時間戳的來歷,應該明白爲何佔用4個字節。
區別:
datetime
和timestamp
之間最大的不一樣就是在於,timestamp隨着時區的變化而變化,默認會根據系統的時區設置來存儲時間,打個比方,若是你在東八區存儲一個時間,以後把數據庫系統設置另外一個時區則取出來的值發生變化。若是你存儲數據的庫分佈在不一樣的時區時你就要考慮這種狀況,而採用datetime
,由於它是不受時區影響的。timestamp
提供了每次數據更新時,自動更新爲現有的時間功能,這個功能比較有用。date
會自動處理一些格式好比'10:11:12'會理解成'2010-11-12',年值在'00-69'mysql會認爲是'2000-2269',年值在'70-99'mysql會認爲'1970-1999'話說mysql還算智能哈。參考文章: The DATE, DATETIME, and TIMESTAMP Types java編程中遇到的時區與時間問題總結 How to convert a String to a Date using SimpleDateFormat? 計算機時間、unix時間、linux時間、java時間爲什麼以1970年1月1日爲原點?從1970年1月1日開始計算? 協調世界時 格林威治時間 unix時間戳