在項目開發中,很多時候會用到android的時間,羅列一下獲取的時間的方式,和大家共同學習進步
一、獲取系統時間
1.通過Calendar類來獲取系統當前的時間
Calendar calendar = Calendar.getInstance(); long unixTime = calendar.getTimeInMillis();//這是時間戳 Logger.i(TAG,"calendar--->>>"+"當前時間為:" + calendar.get(Calendar.YEAR) + "年 " + calendar.get(Calendar.MONTH) + "月 " + calendar.get(Calendar.DAY_OF_MONTH) + "日 " + calendar.get(Calendar.HOUR_OF_DAY) + "時 " + calendar.get(Calendar.MINUTE) + "分 " + calendar.get(Calendar.SECOND) + "秒");打印結果如下:
calendar--->>>當前時間為:2016年 6月 13日 14時 38分 58秒
2.通過Time來獲取,android的文檔中說使用Time比Calendar對CPU的性能損耗更小,我卻不推薦使用Time,因為Time使用必須在24小時制的系統中,如果用戶手機就設成12小時制的,這時就有誤差
Time times = new Time("GMT+8"); /*對於已經設定為GMT時間標準的dateFormat來說,一切需要他轉換的字符串日期都是GMT標準時間,轉換後返回的Date由於默認 *遵守系統默認時區,所以轉換給Date的日期需要+8(例如北京標準時區),也就是時區與標準不同導致的時差。*/ times.setToNow(); int year = times.year; int month = times.month; int day = times.monthDay; int minute = times.minute; int hour = times.hour; int sec = times.second; Logger.i(TAG,"當前時間為:" + year + "年 " + month + "月 " + day + "日 " + hour + "時 " + minute + "分 " + sec + "秒");打印結果:當前時間為:2016年 6月 13日 6時 38分 58秒
註意:這時的時間和上面使用時間是同一時間,不過時間我都調成是12小時制的
當然,還有其他的獲取方式,不過結果基本都一樣
import Java.text.SimpleDateFormat;
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月dd日 HH:mm:ss");
Date curDate = new Date(system.currentTimeMillis());
String str = formatter.format(curDate);
還有
DateFormat df = new SimpleDateFormat("HH:mm:ss");
df.format(new Date());
二:獲取網絡時間
很多時候,由於手機的不確定性,導致各個手機的時間都不盡相同,如果開發中需要獲取統一的時間來匹配一些規則的時候,比如我之前公司就是通過或去當前時間並且轉換之後來匹配網絡連接的規則,防止大批量的抓包,那麽這個時候就需要一個統一的時間和後臺進行匹配,這是簡單的使用獲取系統時間就可能存在問題,用戶手機如果調成自動獲取網絡時間的話沒問題,但是如果不是呢?所以獲取網絡時間就派上了用處
URL url = null;//取得資源對象 try { url = new URL("http://www.baidu.com"); URLConnection uc = url.openConnection();//生成連接對象 uc.connect(); //發出連接 ld = uc.getDate(); //取得網站日期時間 Logger.i(TAG,"ld---->>>>"+ld); } catch (Exception e) { e.printStackTrace(); }
另:(1)獲取android系統時間是24小時制還是12小時制:
ContentResolver cv = DoctorApplication.getApplication().getContentResolver(); //DoctorApplication.getApplication()我自己定義的上下文這是,使用的時候換成自己的就行打印結果:String strTimeFormat = android.provider.Settings.System.getString(cv,android.provider.Settings.System.TIME_12_24);Logger.i(TAG,"strTimeFormat========="+strTimeFormat);
strTimeFormat=========12
剛才為了測試那個Time調成的12小時制
(2)獲取當前系統的對應的其他地方去時間
上海:
獲取本機時間對應的上海時間:
Time shanghai = new Time("Asia/Shanghai"); shanghai.set(System.currentTimeMillis()); Logger.i(TAG,"mShangHaiTime----->>>"+shanghai.format2445());
各位可能想了解類似Asia/Shanghai從哪邊可以查到,本文最後將附上查找表。
(3)
計算手機當前時區和北京時區的差值:
Date date = new Date(); long timezoneDiff = TimeZone.getDefault().getOffset(date.getTime()) - TimeZone .getTimeZone("GMT+8").getOffset(date.getTime());
通過這個差值和之前我們獲取網絡時間,可以計算出本機時間和網絡時間的差值。對時間進行轉換,解決一系列的時間錯誤問題。
引申釋義
Unix時間戳(Unix timestamp),或稱Unix時間(Unix time)、POSIX時間(POSIX time),是一種時間表示方法,
定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。Unix時間戳不僅被使用在Unix系統、類Unix系
統中,也在許多其他操作系統中被廣泛采用。
二、關於時間標準和時區
1、原子時:International Atomic Time (IAT)
又稱國際原子時,是一種通過原子鐘得到的時間標準,原子鐘是世界上已知最準確的時間測量和頻率標準,原子鐘
在 37 億年的誤差不超過 1 秒。
2、世界時:Universal Time(UT)
是一種以格林尼治子夜起算的平太陽時。世界時是以地球自轉為基準得到的時間尺度,其精度受到地球自轉不均勻
變化和極移的影響,為了解決這種影響,1955年國際天文聯合會定義了UT0、UT1和UT2三個系統,他們三者之間是遞
進的關系,後者都是發現前者的一些度量差別,通過修正得到更均勻的時標。
在格林尼治子午線上的平太陽時稱為世界時(UT0),又叫格林尼治平時(GMT)。格林尼治標準時間(舊譯格林尼治平均時
間或格林威治標準時間,英語:Greenwich Mean Time,GMT)是指位於英國倫敦郊區的皇家格林尼治天文臺的標準時間,
因為本初子午線被定義在通過那裏的經線。自1924年2月5日開始,格林尼治天文臺每隔一小時會向全世界發放調時信息。
3、協調世界時:Coordinated Universal Time(UTC)
又稱世界標準時間、世界統一時間。是經過平均太陽時(以格林威治時間GMT為準)、地軸運動修正後的新時標以及以“秒”
為單位的國際原子時所綜合精算而成的時間,計算過程相當嚴謹精密,因此若以“世界標準時間”的角度來說,UTC比GMT更
精準。其誤差值必須保持在0.9秒以內,若大於0.9秒則由位於巴黎的國際地球自轉事務中央局發布閏秒,使UTC與地球自轉周期一致。
基本上UTC的本質強調的是比GMT更精確的世界時間標準,UTC中多一個閏秒的調整,以確保協調世界時(UTC)與格林尼治平
時(GMT)相差不會超過0.9秒,並在有需要的時候在協調世界時(UTC)內加上正或負閏秒。
UTC被應用在大多數的計算機以及網絡標準中。
4、夏令時與冬令時:Daylight Saving Time(DST)
又稱“日光節約時制”和“夏令時間”,是一種為節約能源而人為規定地方時間的制度,在這一制度實行期間所采用的統一時間稱
為“夏令時間”。一般在天亮早的夏季人為將時間提前一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約
照明用電。各個采納夏時制的國家具體規定不同。目前全世界有近110個國家每年要實行夏令時。自2011年3月27日開始俄羅斯永
久使用夏令時,把時間撥快一小時,不再調回。
簡單來說,使用夏令時和冬令時即在夏季將時間撥快一個小時,等到冬季再將時間撥慢一個小時。
5、CST
CST同時代表澳大利亞、美國、中國、古巴四個國家的標準時間,時區分別為:
澳洲中部時間,Central Standard Time (Australia) UT+9:30
中部標準時區(北美洲),Central Standard Time (North America) UT-6:00
北京時間,China Standard Time UT+8:00
古巴標準時間,Cuba Standard Time UT-4:00
在開發時我們需要註意不同國家的時區,並且UTC和GMT在計算機系統中使用並無明顯差別,可視為等同。
三、規範
在實際開發中,當時間用於顯示時,非特殊要求下一般使用系統默認的時區時間作為顯示時間。將時間做為數據存儲或傳遞
給其他系統時(特別是跨平臺調用),則最好使用標準的UTC/GMT時間(後面統稱GMT),除非事先約定或標識了時間的類型。
四、在Android中需要特別註意的事項
1、Android中表示日期時間的類型,有Date、Calendar,他們在沒有顯示設置其時區時,取到的當前時間均為系統默認時區的時間,
即使給定一個時間,同樣是按系統默認時區來換算時間,所以說他們都是與時區相關的。
2、SimpleDateFormat對象本身也是跟時區相關。
當使用parse將一個字符串格式的日期轉換為Date對象,或者將一個Date對象轉換為字符串日期時,這個字符串日期的時區
以SimpleDateFormat關聯的時區為準,如果通過setTimeZone修改了時區,則這個字符串日期以修改後的時區為準。
3、Calendar在不手動設置時區時,是與系統默認時區相關的。在手動修改時區後,不能使用calendar.getTime方法來
直接獲取Date日期,因為此時的日期與setTime時的值相同,想要正確獲取修改時區後的時間,應該通過calendar的get方法
4、TimeZone
在開發中,我們可以通過TimeZone對象獲取關於系統默認時區及其相關的詳細信息。
附國家縮寫和時區名稱對照表:
//主要城市,國家對應表 String[] world = new String[]{ "ad", "Europe/Andorra", "ae", "Asia/Dubai", "af", "Asia/Kabul", "ag", "America/Antigua", "ai", "America/Anguilla", "al", "Europe/Tirane", "am", "Asia/Yerevan", "an", "America/Curacao", "ao", "Africa/Luanda", "aq", "Antarctica/McMurdo", "aq", "Antarctica/DumontDUrville", "aq", "Antarctica/Casey", "aq", "Antarctica/Davis", "aq", "Antarctica/Mawson", "aq", "Antarctica/Syowa", "aq", "Antarctica/Rothera", "aq", "Antarctica/Palmer", "ar", "America/Argentina/Buenos_Aires", "as", "Pacific/Pago_Pago", "at", "Europe/Vienna", "au", "Australia/Sydney", "au", "Australia/Adelaide", "au", "Australia/Perth", "au", "Australia/Eucla", "aw", "America/Aruba", "ax", "Europe/Mariehamn", "az", "Asia/Baku", "ba", "Europe/Sarajevo", "bb", "America/Barbados", "bd", "Asia/Dhaka", "be", "Europe/Brussels", "bf", "Africa/Ouagadougou", "bg", "Europe/Sofia", "bh", "Asia/Bahrain", "bi", "Africa/Bujumbura", "bj", "Africa/Porto-Novo", "bm", "Atlantic/Bermuda", "bn", "Asia/Brunei", "bo", "America/La_Paz", "br", "America/Noronha", "br", "America/Sao_Paulo", "br", "America/Manaus", "bs", "America/Nassau", "bt", "Asia/Thimphu", "bw", "Africa/Gaborone", "by", "Europe/Minsk", "bz", "America/Belize", "ca", "America/St_Johns", "ca", "America/Halifax", "ca", "America/Toronto", "ca", "America/Winnipeg", "ca", "America/Edmonton", "ca", "America/Vancouver", "cc", "Indian/Cocos", "cd", "Africa/Lubumbashi", "cd", "Africa/Kinshasa", "cf", "Africa/Bangui", "cg", "Africa/Brazzaville", "ch", "Europe/Zurich", "ci", "Africa/Abidjan", "ck", "Pacific/Rarotonga", "cl", "America/Santiago", "cl", "Pacific/Easter", "cm", "Africa/Douala", "cn", "Asia/Shanghai", "co", "America/Bogota", "cr", "America/Costa_Rica", "cu", "America/Havana", "cv", "Atlantic/Cape_Verde", "cx", "Indian/Christmas", "cy", "Asia/Nicosia", "cz", "Europe/Prague", "de", "Europe/Berlin", "dj", "Africa/Djibouti", "dk", "Europe/Copenhagen", "dm", "America/Dominica", "do", "America/Santo_Domingo", "dz", "Africa/Algiers", "ec", "America/Guayaquil", "ec", "Pacific/Galapagos", "ee", "Europe/Tallinn", "eg", "Africa/Cairo", "eh", "Africa/El_Aaiun", "er", "Africa/Asmara", "es", "Europe/Madrid", "es", "Atlantic/Canary", "et", "Africa/Addis_Ababa", "fi", "Europe/Helsinki", "fj", "Pacific/Fiji", "fk", "Atlantic/Stanley", "fm", "Pacific/Ponape", "fm", "Pacific/Truk", "fo", "Atlantic/Faroe", "fr", "Europe/Paris", "ga", "Africa/Libreville", "gb", "Europe/London", "gd", "America/Grenada", "ge", "Asia/Tbilisi", "gf", "America/Cayenne", "gg", "Europe/Guernsey", "gh", "Africa/Accra", "gi", "Europe/Gibraltar", "gl", "America/Danmarkshavn", "gl", "America/Scoresbysund", "gl", "America/Godthab", "gl", "America/Thule", "gm", "Africa/Banjul", "gn", "Africa/Conakry", "gp", "America/Guadeloupe", "gq", "Africa/Malabo", "gr", "Europe/Athens", "gs", "Atlantic/South_Georgia", "gt", "America/Guatemala", "gu", "Pacific/Guam", "gw", "Africa/Bissau", "gy", "America/Guyana", "hk", "Asia/Hong_Kong", "hn", "America/Tegucigalpa", "hr", "Europe/Zagreb", "ht", "America/Port-au-Prince", "hu", "Europe/Budapest", "id", "Asia/Jayapura", "id", "Asia/Makassar", "id", "Asia/Jakarta", "ie", "Europe/Dublin", "il", "Asia/Jerusalem", "im", "Europe/Isle_of_Man", "in", "Asia/Calcutta", "io", "Indian/Chagos", "iq", "Asia/Baghdad", "ir", "Asia/Tehran", "is", "Atlantic/Reykjavik", "it", "Europe/Rome", "je", "Europe/Jersey", "jm", "America/Jamaica", "jo", "Asia/Amman", "jp", "Asia/Tokyo", "ke", "Africa/Nairobi", "kg", "Asia/Bishkek", "kh", "Asia/Phnom_Penh", "ki", "Pacific/Kiritimati", "ki", "Pacific/Enderbury", "ki", "Pacific/Tarawa", "km", "Indian/Comoro", "kn", "America/St_Kitts", "kp", "Asia/Pyongyang", "kr", "Asia/Seoul", "kw", "Asia/Kuwait", "ky", "America/Cayman", "kz", "Asia/Almaty", "kz", "Asia/Aqtau", "la", "Asia/Vientiane", "lb", "Asia/Beirut", "lc", "America/St_Lucia", "li", "Europe/Vaduz", "lk", "Asia/Colombo", "lr", "Africa/Monrovia", "ls", "Africa/Maseru", "lt", "Europe/Vilnius", "lu", "Europe/Luxembourg", "lv", "Europe/Riga", "ly", "Africa/Tripoli", "ma", "Africa/Casablanca", "mc", "Europe/Monaco", "md", "Europe/Chisinau", "me", "Europe/Podgorica", "mg", "Indian/Antananarivo", "mh", "Pacific/Majuro", "mk", "Europe/Skopje", "ml", "Africa/Bamako", "mm", "Asia/Rangoon", "mn", "Asia/Choibalsan", "mn", "Asia/Hovd", "mo", "Asia/Macau", "mp", "Pacific/Saipan", "mq", "America/Martinique", "mr", "Africa/Nouakchott", "ms", "America/Montserrat", "mt", "Europe/Malta", "mu", "Indian/Mauritius", "mv", "Indian/Maldives", "mw", "Africa/Blantyre", "mx", "America/Mexico_City", "mx", "America/Chihuahua", "mx", "America/Tijuana", "my", "Asia/Kuala_Lumpur", "mz", "Africa/Maputo", "na", "Africa/Windhoek", "nc", "Pacific/Noumea", "ne", "Africa/Niamey", "nf", "Pacific/Norfolk", "ng", "Africa/Lagos", "ni", "America/Managua", "nl", "Europe/Amsterdam", "no", "Europe/Oslo", "np", "Asia/Katmandu", "nr", "Pacific/Nauru", "nu", "Pacific/Niue", "nz", "Pacific/Auckland", "nz", "Pacific/Chatham", "om", "Asia/Muscat", "pa", "America/Panama", "pe", "America/Lima", "pf", "Pacific/Gambier", "pf", "Pacific/Marquesas", "pf", "Pacific/Tahiti", "pg", "Pacific/Port_Moresby", "ph", "Asia/Manila", "pk", "Asia/Karachi", "pl", "Europe/Warsaw", "pm", "America/Miquelon", "pn", "Pacific/Pitcairn", "pr", "America/Puerto_Rico", "ps", "Asia/Gaza", "pt", "Europe/Lisbon", "pt", "Atlantic/Azores", "pw", "Pacific/Palau", "py", "America/Asuncion", "qa", "Asia/Qatar", "re", "Indian/Reunion", "ro", "Europe/Bucharest", "rs", "Europe/Belgrade", "ru", "Asia/Kamchatka", "ru", "Asia/Magadan", "ru", "Asia/Vladivostok", "ru", "Asia/Yakutsk", "ru", "Asia/Irkutsk", "ru", "Asia/Krasnoyarsk", "ru", "Asia/Novosibirsk", "ru", "Asia/Yekaterinburg", "ru", "Europe/Samara", "ru", "Europe/Moscow", "ru", "Europe/Kaliningrad", "rw", "Africa/Kigali", "sa", "Asia/Riyadh", "sb", "Pacific/Guadalcanal", "sc", "Indian/Mahe", "sd", "Africa/Khartoum", "se", "Europe/Stockholm", "sg", "Asia/Singapore", "sh", "Atlantic/St_Helena", "si", "Europe/Ljubljana", "sj", "Arctic/Longyearbyen", "sk", "Europe/Bratislava", "sl", "Africa/Freetown", "sm", "Europe/San_Marino", "sn", "Africa/Dakar", "so", "Africa/Mogadishu", "sr", "America/Paramaribo", "st", "Africa/Sao_Tome", "sv", "America/El_Salvador", "sy", "Asia/Damascus", "sz", "Africa/Mbabane", "tc", "America/Grand_Turk", "td", "Africa/Ndjamena", "tf", "Indian/Kerguelen", "tg", "Africa/Lome", "th", "Asia/Bangkok", "tj", "Asia/Dushanbe", "tk", "Pacific/Fakaofo", "tl", "Asia/Dili", "tm", "Asia/Ashgabat", "tn", "Africa/Tunis", "to", "Pacific/Tongatapu", "tr", "Europe/Istanbul", "tt", "America/Port_of_Spain", "tv", "Pacific/Funafuti", "tw", "Asia/Taipei", "tz", "Africa/Dar_es_Salaam", "ua", "Europe/Kiev", "ug", "Africa/Kampala", "um", "Pacific/Wake", "um", "Pacific/Johnston", "um", "Pacific/Midway", "us", "America/New_York", "us", "America/Chicago", "us", "America/Denver", "us", "America/Los_Angeles", "us", "America/Anchorage", "us", "Pacific/Honolulu", "uy", "America/Montevideo", "uz", "Asia/Tashkent", "va", "Europe/Vatican", "vc", "America/St_Vincent", "ve", "America/Caracas", "vg", "America/Tortola", "vi", "America/St_Thomas", "vn", "Asia/Saigon", "vu", "Pacific/Efate", "wf", "Pacific/Wallis", "ws", "Pacific/Apia", "ye", "Asia/Aden", "yt", "Indian/Mayotte", "za", "Africa/Johannesburg", "zm", "Africa/Lusaka", "zw", "Africa/Harare", };
Tags: android calendar 項目開發 字符串 北京
文章來源: