android-獲取網(wǎng)絡(luò)時間、獲取特定時區(qū)時間、時間同步的方法
最近整理出android-獲取網(wǎng)絡(luò)時間、獲取特定時區(qū)時間、時間同步的方法。具體如下:
方法一:
SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dff.setTimeZone(TimeZone.getTimeZone("GMT+08"));
String ee = dff.format(new Date());
這個方法獲取的結(jié)果是24小時制的,月份也正確。
這個方法不隨手機時間的變動而變動。也就是說,即使手機設(shè)置成別的時區(qū),不是東八區(qū),這個方法返回的也照樣是北京時間?。?!這正是我在做項目的時候用到的方法??!徹底解決項目需求!
方法二:
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String rt = sdf.format(calendar.getTime());
這個方法獲取的結(jié)果是不是24小時制的,月份也正確。
方法三:
public static String getLocalDatetimeString(String local) {
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone(local));
cal.setTimeInMillis(Calendar.getInstance().getTimeInMillis());
String date = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH);
String time = cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND);
return date + " " + time;
}
方法調(diào)用:
String tt = getLocalDatetimeString("GMT+8");
代碼里也看出來了,這個在月份上加了一個1, 24小時制
以上三種方法驗證如下:
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class TimeTest {
/**
* @param args
*/
public static void main(String[] args) {
method1();
method2();
method3();
}
static void method1(){
SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dff.setTimeZone(TimeZone.getTimeZone("GMT+08"));
String ee = dff.format(new Date());
System.out.println("ee="+ee);
}
static void method2(){
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String rt = sdf.format(calendar.getTime());
System.out.println("TimeTest.method2() rt="+rt);
}
static void method3(){
String local = "GMT+8";
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone(local));
cal.setTimeInMillis(Calendar.getInstance().getTimeInMillis());
String date = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH);
String time = cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND);
System.out.println("TimeTest.method3() date="+date+",time="+time);
}
}
結(jié)果如下:

本人采用的是第一種方法,因為第一種方法的時間是不隨手機時間的設(shè)置而改變。
第二種方法也是可以的,不過時間小時是12進制。
第四種方法:
網(wǎng)上還有這種方法獲取時間:
URL url=new URL("http://www.bjtime.cn");//取得資源對象
URLConnection uc=url.openConnection();//生成連接對象
uc.connect(); //發(fā)出連接
long ld=uc.getDate(); //取得網(wǎng)站日期時間
Date date=new Date(ld); //轉(zhuǎn)換為標準時間對象
//分別取得時間中的小時,分鐘和秒,并輸出
System.out.print(date.getHours()+"時"+date.getMinutes()+"分"+date.getSeconds()+"秒");
這種方式需要開啟一個線程獲取時間,同時也存在著一種風險就是由于網(wǎng)絡(luò)問題,獲取不到響應的問題。還有一個重要的問題件就是這個時間的獲取會隨著手機時區(qū)的改變而改變。
方法五:
通過網(wǎng)絡(luò)或者GPS的方式。
代碼:
LocationManager locMan = (LocationManager) this.getSystemService(MainActivity.LOCATION_SERVICE); //獲取最近一次知道的時間 long networkTS = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getTime();
或者實時的獲取時間:
locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); //獲取當前時間
當我們使用requestLocationUpdates時,我們需要實現(xiàn)LocationListener接口。
在LocationListen的回調(diào)onLocationChanged當中獲取時間
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
long time = location.getTime();
Date date = new Date(time);
System.out.println(time + " NETWORK_PROVIDER " + date);
// System.out.println(STANDARD_TIME + " ");
}
這種方式是利用手機定位系統(tǒng)進行時間的獲取,但是這種方式會隨著手機的設(shè)置的時區(qū)的變動而改變。
第四種方式和第五種方式,我都在手機端進行了驗證,可以正常獲取時間。方式是沒有問題的。
既然有這么多方法,大家看著那種方式適合自己的需求,選擇相應的方法。
我還是推薦第一種方法!簡單實用?。。。_^
今天再在本文基礎(chǔ)上補充一些內(nèi)容?,F(xiàn)在我的項目中有這樣一種需求:就是播放視頻的時候,特別是監(jiān)控視頻,我想要有時間限制,在一定時間內(nèi)可以觀看,超出設(shè)置的時間,不能觀看。
Android端對于這樣的需求,上面的幾種方法都不行了,因為上面的方法都跟手機系統(tǒng)有關(guān)系了,當我改變手機系統(tǒng)的時間,時區(qū)等都會造成獲取的時間不對應,跟服務(wù)器時間不對。怎么辦呢?有辦法?。。?nbsp;
我是這樣做的,當獲取到信息的時候,比如視頻節(jié)點信息的時候,服務(wù)器順帶著把服務(wù)器當前的時間返回來,有了服務(wù)器的時間,剩下的我就利用用戶操作的時間間隔,加上服務(wù)器的時間不就是手機所在地當前的時間嗎?
那么時間間隔怎么算呢?請看下面的SystemClock類幾個方法:
1、System.currentTimeMillis()是一個標準的“墻”時鐘(時間和日期),表示從紀元到現(xiàn)在的毫秒數(shù)。該墻時鐘能夠被用戶或電話網(wǎng)絡(luò)(見setCurrentTimeMillis(long))設(shè)置,所以該時間可能會向前或向后不可預知地跳越。該時鐘應該僅僅被使用在當現(xiàn)實世界的對應的日期和時間是重要的情況,例如一個日歷或鬧鐘應用程序。而間隔時間和經(jīng)過時間應該使用不同的時鐘。如果你使用System.currentTimeMillis(),可以考慮監(jiān)聽ACTION為ACTION_TIME_TICK、 ACTION_TIME_CHANGED、ACTION_TIMEZONE_CHANGED 的廣播去監(jiān)聽時間變化。
2、uptimeMillis()表示自系統(tǒng)啟動時開始計數(shù),以毫秒為單位。返回的是從系統(tǒng)啟動到現(xiàn)在這個過程中的處于非休眠期的時間。當系統(tǒng)進入深度睡眠時(CPU關(guān)閉,設(shè)備變黑,等待外部輸入裝置)該時鐘會停止。但是該時鐘不會被時鐘調(diào)整,閑置或其他節(jié)能機所影響。這是大多數(shù)間隔時間的基本點,例如Thread.sleep(millls)、Object.wait(millis)和System.nanoTime()。該時鐘被保證是單調(diào)的,適用于檢測不包含休眠的間隔時間的情況。大多數(shù)的方法接受一個時間戳的值除了uptimeMillis()時鐘。
3、elapsedRealtime() and elapsedRealtimeNanos() 返回系統(tǒng)啟動到現(xiàn)在的時間,包含設(shè)備深度休眠的時間。該時鐘被保證是單調(diào)的,即使CPU在省電模式下,該時間也會繼續(xù)計時。該時鐘可以被使用在當測量時間間隔可能跨越系統(tǒng)睡眠的時間段。
有幾種機制控制事件發(fā)生的時間:
1、標準的方法像Thread.sleep(millis) 和 Object.wait(millis)總是可用的,這些方法使用的是uptimeMillis()時鐘,如果設(shè)備進入深度休眠,剩余的時間將被推遲直到系統(tǒng)喚醒。這些同步方法可能被Thread.interrupt()中斷,并且你必須處理InterruptedException異常。
2、SystemClock.sleep(millis)是一個類似于Thread.sleep(millis)的實用方法,但是它忽略InterruptedException異常。使用該函數(shù)產(chǎn)生的延遲如果你不使用Thread.interrupt(),因為它會保存線程的中斷狀態(tài)。
3、Handler可以在一個相對或者絕對的時間設(shè)置異步回調(diào),Handler類對象也使用uptimeMillis()時鐘,而且需要一個loop(經(jīng)常出現(xiàn)在GUI程序中)。
4、AlarmManager可以觸發(fā)一次或重復事件,即使設(shè)備深度休眠或者應用程序沒有運行。事件可以選擇用 currentTimeMillis或者elapsedRealtime()(ELAPSED_REALTIME)來設(shè)置時間,當事件發(fā)生會觸發(fā)一個廣播。
方法:
1、public static long currentThreadTimeMillis () 返在當前線程運行的毫秒數(shù)。
2、public static long elapsedRealtime () 返回系統(tǒng)啟動到現(xiàn)在的毫秒數(shù),包含休眠時間。
3、public static long elapsedRealtimeNanos () 返回系統(tǒng)啟動到現(xiàn)在的納秒數(shù),包含休眠時間。
4、public static boolean setCurrentTimeMillis (long millis) 設(shè)置當前的”墻”時間,要求調(diào)用進程有許可權(quán)限。返回是否成功。
5、public static void sleep (long ms) 等待給定的時間。和Thread.sleep(millis)類似,但是它不會拋出InterruptedException異常。事件被推遲到下一個中斷操作。該方法直到指定的時間過去才返回。
6、public static long uptimeMillis () 返回系統(tǒng)啟動到現(xiàn)在的毫秒數(shù),不包含休眠時間。就是說統(tǒng)計系統(tǒng)啟動到現(xiàn)在的非休眠期時間。
這些方法大家看看就知道啦。
剩下的就是計算事件間隔了:
public static long elapsedRealtime () 返回系統(tǒng)啟動到現(xiàn)在的毫秒數(shù),包含休眠時間
這個方法就可以計算從服務(wù)器返回時間到用戶操作,播放視頻這一段時間的時間間隔。有個這個不就可以做到時間不受手機系統(tǒng)的限制了嗎?
/**
*
* @param ts 形如yyyy-MM-dd hh:mm:ss
* @param intervalTime long類型
* @return String HH:mm:ss
*/
@SuppressLint("SimpleDateFormat")
public static String getTime(String ts,long intervalTime){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Timestamp t=null;
String tt="";
try {
t = new Timestamp(format.parse(ts).getTime());
long ss = t.getTime();
long st = ss+intervalTime;
tt= getTime(st);
} catch (java.text.ParseException e) {
e.printStackTrace();
}
return tt;
}
/**
* @param mis
* @return HH:mm:ss
*/
@SuppressLint("SimpleDateFormat")
public static String getTime(long mis){
SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ee = dff.format(new Date(mis));
return ee.substring(11);
}
上面的方法中, ts參數(shù)就是服務(wù)器返回的當前時間,形如yyyy-MM-dd hh:mm:ss的字符串intervalTime參數(shù),是獲取到服務(wù)器響應到用戶進行操作的時間間隔,就是使用上面的elapsedRealtime ()方法獲取兩次時間計算得到。
方法的返回值String,形如 HH:mm:ss,這樣返回字符串方便比較時間字符。由于視頻事件限制,就是時分秒,不可能涉及到年月日,所以這里就是直接返回時分秒。
有了這個方法,完美解決了android APP與服務(wù)器時間保持基本一致的需求。但是還是存在一定的問題的,因為服務(wù)器返回時間不定,可能長可能短,所以時間并不會和服務(wù)器的當前時間分秒不差,總會有延時,但是這個延時可以接受,大概最多在10秒左右??梢栽跁r間間隔上稍微加一點就可以了?;揪蜐M足需求了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義控件實現(xiàn)帶數(shù)值和動畫的圓形進度條
這篇文章主要為大家詳細介紹了Android自定義控件實現(xiàn)帶數(shù)值和動畫的圓形進度條,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Android圖片的Base64編碼與解碼及解碼Base64圖片方法
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個可打印字符來表示二進制數(shù)據(jù)的方法。接下來通過本文給大家分享Android圖片的Base64編碼與解碼及解碼Base64圖片,需要的朋友參考下吧2017-12-12
Android中使用Handler及Countdowntimer實現(xiàn)包含倒計時的閃屏頁面
這篇文章主要介紹了Android中使用Handler及Countdowntimer實現(xiàn)包含倒計時的閃屏頁面,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03
android Matrix實現(xiàn)圖片隨意放大縮小或拖動
這篇文章主要為大家詳細介紹了android Matrix實現(xiàn)圖片隨意放大縮小或拖動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android ListView用EditText實現(xiàn)搜索功能效果
本篇文章主要介紹了Android ListView用EditText實現(xiàn)搜索功能效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03

