【Android】获取网络时间

有时候我们需要获取较为准确的当前时间,可以通过网络获取网络时间。毕竟手机系统的时间能够被用户所更改。

方法一:叫后端同学出接口,返回你想要的当前时间。

方法二:通过访问某个网站,获取它的服务器时间。(注意时区问题,比如要获取东八区时间,那就访问服务器在国内、且服务器时间是正确的,网站。)

下面是方法二的实现代码,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")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值