讀懂程序裏的--時間

題外話,祝各位程序猿們中秋佳節快樂~~~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個字節。

區別:

  1. 首先要提的就是datetimetimestamp之間最大的不一樣就是在於,timestamp隨着時區的變化而變化,默認會根據系統的時區設置來存儲時間,打個比方,若是你在東八區存儲一個時間,以後把數據庫系統設置另外一個時區則取出來的值發生變化。若是你存儲數據的庫分佈在不一樣的時區時你就要考慮這種狀況,而採用datetime,由於它是不受時區影響的。
  2. 三種時間格式的非法值都會變成'0000-00-00' 或 '0000-00-00 00:00:00'
  3. timestamp提供了每次數據更新時,自動更新爲現有的時間功能,這個功能比較有用。
  4. 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時間戳

相關文章
相關標籤/搜索