有时候我们需要获取较为准确的当前时间,可以通过网络获取网络时间。毕竟手机系统的时间能够被用户所更改。
方法一:叫后端同学出接口,返回你想要的当前时间。
方法二:通过访问某个网站,获取它的服务器时间。(注意时区问题,比如要获取东八区时间,那就访问服务器在国内、且服务器时间是正确的,网站。)
下面是方法二的实现代码,getNetworkTime
函数是传一个网站的地址,返回该网站的时间。
另外,为了可靠性,防止个别网站有坑,导致获取到的时间有误,所以又写了个getCurrentTimeMills
函数,同时获取两个网站的时间,然后进行对比。
import java.lang.Exception
import java.net.URL
import kotlin.math.abs
class NetworkTimeUtil{
companion object {
/**
* 获取网络时间
*@parmas url 网站的地址
*@params callback 回调函数,返回时间戳。如果时间戳为0,则代表获取网络时间失败。
*/
fun getNetworkTime(url: String, callback: (timeMills: Long) -> Unit) {
Thread {
try {
val u = URL(url)
val conn = u.openConnection()
conn.connectTimeout = 3 * 1000
conn.connect()
val time = conn.date
callback.invoke(time)
} catch (e: Exception) {
e.printStackTrace()
callback.invoke(0)
}
}.start()
}
/**
* 获取当前时间
*/
fun getCurrentTimeMills(callback: (timeMills: Long,isNetworkTime:Boolean) -> Unit) {
//获取两个网址的网络时间。如果两个网络时间相差不大,则认为获取到的网络时间比较正确。
//如果相差很大或者网络失败,则返回本地时间。
var netTime1 = -1L
var netTime2 = -1L
getNetworkTime("http://www.ntsc.ac.cn") {
netTime1 = it
if (netTime2 != -1L) {
val callBackTime = if (abs(netTime1 - netTime2) < 10 * 1000L
&& (netTime1 != 0L && netTime2 != 0L)) {
netTime1
}else{
System.currentTimeMillis()
}
callback.invoke(callBackTime, callBackTime == netTime1)
}
}
getNetworkTime("https://www.beijing-time.org") {
netTime2 = it
if (netTime1 != -1L) {
val callBackTime = if (abs(netTime1 - netTime2) < 10 * 1000L
&& (netTime1 != 0L && netTime2 != 0L)) {
netTime1
}else{
System.currentTimeMillis()
}
callback.invoke(callBackTime, callBackTime == netTime1)
}
}
}
}
}
下面是使用示例:
NetworkTimeUtil.getCurrentTimeMills{timeMills,isNetworkTime->
Log.i("TAG","timeMills=$timeMills,是否为网络时间:$isNetworkTime")
}