Unity3D獲得服務器時間/網絡時間/后端時間/ServerTime,適合單機游戲使用


說明

一些游戲開發者在做單機游戲功能時(例如:每日獎勵、簽到等),可能會需要獲得服務端標准時間,用於游戲功能的邏輯處理。

問題分析

1、自己如果有服務器:自定義一個后端API,客戶端按需請求就行了;
2、如果沒有服務器(本篇文章主要講解的內容):

a、可以使用別人的免費API,但是通常問題比較多,例如:服務器關閉了、API禁用了等(該方案有風險);
b、更穩妥點的方案:請求大廠服務器(例如:百度、騰訊、Github等),獲取其響應頭時間;

那么,我們應該選擇穩妥一點的方案:b。

通過抓包工具,我們抓一下網絡請求,分析一下響應頭,如下圖:

通過上圖可知,我們只需要正常請求大廠的最常用的URL,等待響應成功后,讀取響應頭中的“Date”屬性就行了。

代碼實現

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TestDate : MonoBehaviour
{
	void Start ()
	{
		getServerTime ();
	}

	//獲得服務器時間
	public void getServerTime ()
	{
		string url1 = "https://www.baidu.com";
		StartCoroutine (IServerTime (url1));

		string url2 = "https://blog.csdn.net";
		StartCoroutine (IServerTime (url2));

		string url3 = "https://www.jianshu.com";
		StartCoroutine (IServerTime (url3));

		string url4 = "https://github.com";
		StartCoroutine (IServerTime (url4));

		string url5 = "https://www.sohu.com";
		StartCoroutine (IServerTime (url5));
	}

	IEnumerator IServerTime (string url)
	{
		Debug.Log ("開始獲取“+url+”的服務器時間(GMT DATE)");
		WWW www = new WWW (url);
		yield return www;
		if (www.isDone && string.IsNullOrEmpty (www.error)) {
			Dictionary<string,string> resHeaders = www.responseHeaders;
			string key = "DATE";
			string value = null;
			if(resHeaders!=null && resHeaders.ContainsKey(key)){
				resHeaders.TryGetValue (key,out value);
			}

			if(value==null){
				Debug.Log ("DATE is null");
				yield break;
			}

			//打印格林威治時間
			Debug.Log (url+" 的 GMT DATE : "+value);

			//打印本地時間(東八區)
			Debug.Log (url+" 的 北京時間:"+ GMT2Local(value));
		}
	}

	/// <summary>
	/// GMT時間轉成本地時間
	/// </summary>
	/// <param name="gmt">字符串形式的GMT時間</param>
	/// <returns></returns>
	public DateTime GMT2Local(string gmt)
	{
		DateTime dt = DateTime.MinValue;
		try
		{
			string pattern = "";
			if (gmt.IndexOf("+0") != -1)
			{
				gmt = gmt.Replace("GMT", "");
				pattern = "ddd, dd MMM yyyy HH':'mm':'ss zzz";
			}
			if (gmt.ToUpper().IndexOf("GMT") != -1)
			{
				pattern = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
			}
			if (pattern != "")
			{
				dt = DateTime.ParseExact(gmt, pattern, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
				dt = dt.ToLocalTime();
			}
			else
			{
				dt = Convert.ToDateTime(gmt);
			}
		}
		catch
		{
		}
		return dt;
	}
}

將腳本掛載到Unity游戲對象上,運行游戲,查看日志輸出,如下圖:

總結

該實現方案,非常簡單實用,大家也無需擔心大廠倒閉。

通過響應頭取出來的時間,默認是格林威治時間(GMT)。
上面案例中,已做了格林威治時間轉換為東八區時間(北京時間),如果大家做的游戲是要發布到全世界的,最好再根據不同國家的時區,進行計算一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM