我想在我的应用程序中找到一种方法来将日期和时间与外部源给出的内容同步.
我不想使用手机时间,因为我可能会在实时间差5分钟左右.5分钟或更少= 10分钟!
我听说过GPS卫星或网络天线的时间信息.
我已经尝试过使用System.getCurrentTime,但是我得到了设备的当前设备,因此,如果我的设备提前5分钟设置,则会显示错误的时间.
编辑
提出一个简短的问题:我怎么能得到这个时间?
我不知道,但发现这个问题很有意思.所以我挖了android代码...谢谢开源:)
你显示的屏幕是DateTimeSettings
."使用网络提供的值"复选框与共享首选项相关联String KEY_AUTO_TIME = "auto_time";
,也与Settings.System.AUTO_TIME
这个设置是由mAutoTimeObserver
2个网络中ServiceStateTracker
的被观察者观察到的:
GsmServiceStateTracker
和CdmaServiceStateTracker
.
两种实现都调用revertToNitz()
设置变为true时调用的方法.显然,NITZ相当于运营商世界的NTP.
底线:您可以将时间设置为运营商提供的价值,这要归功于revertToNitz()
.不幸的是,我还没有找到一种机制来获取网络时间.如果你真的需要这样做,我担心,你将不得不复制这些ServiceStateTracker
实现,捕获框架提出的意图(我想),并添加一个getter mSavedTime
.
从http://commons.apache.org/net/download_net.cgi获取库
//NTP server list: http://tf.nist.gov/tf-cgi/servers.cgi public static final String TIME_SERVER = "time-a.nist.gov"; public static long getCurrentNetworkTime() { NTPUDPClient timeClient = new NTPUDPClient(); InetAddress inetAddress = InetAddress.getByName(TIME_SERVER); TimeInfo timeInfo = timeClient.getTime(inetAddress); //long returnTime = timeInfo.getReturnTime(); //local device time long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); //server time Date time = new Date(returnTime); Log.d(TAG, "Time from " + TIME_SERVER + ": " + time); return returnTime; }
getReturnTime()与System.currentTimeMillis()相同.
应该使用getReceiveTimeStamp()或getTransmitTimeStamp()方法.
将系统时间设置为1小时后,您可以看到差异.
local time : System.currentTimeMillis() timeInfo.getReturnTime() timeInfo.getMessage().getOriginateTimeStamp().getTime() NTP server time : timeInfo.getMessage().getReceiveTimeStamp().getTime() timeInfo.getMessage().getTransmitTimeStamp().getTime()
试试这段代码:
String timeSettings = android.provider.Settings.System.getString( this.getContentResolver(), android.provider.Settings.System.AUTO_TIME); if (timeSettings.contentEquals("0")) { android.provider.Settings.System.putString( this.getContentResolver(), android.provider.Settings.System.AUTO_TIME, "1"); } Date now = new Date(System.currentTimeMillis()); Log.d("Date", now.toString());
确保在Manifest中添加权限