基本概念
時區(qū) :time zone 1884年國際經線會議規(guī)定,全球按經度分為24個時區(qū),每區(qū)各占經度15°。
以本初子午線為中央經線的時區(qū)為零時區(qū),由零時區(qū)向東、西各分12區(qū),東、西12區(qū)都是半時區(qū),共同使用180°經線的地方時。
CST :China Standard Time UTC+8:00 中國標準時間(北京時間),在東八區(qū)
UTC :Universal Time Coordinated,世界協(xié)調時間,又稱世界標準時間、世界統(tǒng)一時間。UTC 提供了一種與時區(qū)無關(或非特定于時區(qū))的時間。
世界上的所有時區(qū)都可以表示為 UTC 加上或減去一個偏移量。
因此,UTC是0時區(qū)的時間,如北京為早上八點(東八區(qū)),UTC時間就為零點,時間比北京時晚八小時
GMT :Greenwich Mean Time格林威治標準時間,指位于英國倫敦郊區(qū)的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那里的經線。
Unix timestamp :Unix時間戳,或稱Unix時間(Unix time)、POSIX時間(POSIX time),是一種時間表示方式,
定義為從格林威治時間(UTC/GMT的午夜)1970年01月01日00時00分00秒起至現(xiàn)在的總秒數(shù)。
可以這么說:
UTC和GMT幾乎是同一概念,兩者的區(qū)別是GMT是一個天文上的概念,UTC是基于原子鐘。
GMT=UTC
GMT + 8 = UTC + 8 = CST
UTC+時間差=本地時間 (時間差東為正,西為負,東八區(qū)記為 +0800)
總結
System.currentTimeMillis():可以提取到當前時間的毫秒數(shù),產生一個當前的毫秒,這個毫秒其實就是自1970年1月1日0時起的毫秒數(shù)。等同于new Date().getTime() ?
java.util.Date代表一個時間點,其值為距公元1970年1月1日 00:00:00的毫秒數(shù)。所以它是沒有時區(qū)和Locale概念的。java通過如下形式取得當前時間點:Date now = new Date();? //這個時間點與本地系統(tǒng)的時區(qū)無關
而正因為其與時區(qū)的無關性,才使得我們的存儲數(shù)據(jù)(時間)是一致的(時區(qū)一致性)。
一般的我們將now存儲于數(shù)據(jù)庫中,當我們需要展現(xiàn)數(shù)據(jù)時,將now格式化成想要的格式,如:2015-04-13 21:22:24
而這個功能一般交由java.text.DateFormat來實現(xiàn)。例如:
1SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2String snow = sdf.format(now);
如果想支持國際化時間,則先指定時區(qū),然后再格式化date數(shù)據(jù)。例如:
SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
3String snow = sdf.format(now);// snow = 2015-04-04 21:22:24
4sdf.setTimeZone(TimeZone.getTimeZone("GMT+7"));
5String snow2 = sdf.format(now);// snow2 = 2015-04-04 20:22:24 (可見:東八區(qū)比東七區(qū)早一個小時)
另外,你可以通過如下代碼修改本地時區(qū)信息:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));