Unity 获取网络 并转换成时间戳

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.Networking;

public class HTTPTimeManager
{
    private static HTTPTimeManager instance;
    public static HTTPTimeManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new HTTPTimeManager();
            }
            return instance;

        }
    }
    public HTTPTimeManager()
    {
        if (Timer_t == null)
        {
            Timer_t = new Time();
        }

    }
    /// <summary>
    /// 时间
    /// </summary>
    public Time Timer_t;


    /// <summary>
    /// 时间类
    /// </summary>
    public class Time
    {

        public Time()
        {

            _Action_SaveCurrentTime = SaveCurrentTime;
        }
        public Action<decimal> _Action_SaveCurrentTime;
        /// <summary>
        /// 当前时间
        /// </summary>
        public decimal Time_Current
        {
            get
            {
                try
                {
                    return decimal.Parse(PlayerPrefs.GetString("Time_Current"));
                }
                catch
                {
                    Debug.Log("当前时间  未  初始化");
                    return 0;
                }
            }
        }

        /// <summary>
        /// 存储当前时间
        /// </summary>
        /// <param name="value"></param>
        private void SaveCurrentTime(decimal value)
        {
            PlayerPrefs.SetString("Time_Current", value.ToString());
        }
    }

    #region 获取时间的地址 +++++++ 大厂网址
    private const string url1 = "https://www.baidu.com";
    /*
    private const string url2 = "https://blog.csdn.net";
    private const string url3 = "https://www.jianshu.com";
    private const string url4 = "https://github.com";
    private const string url5 = "https://www.sohu.com";
    */
    #endregion

    /// <summary>
    /// 初始化时间管理器
    /// </summary>
    /// <param name="mono"></param>
    public void Init_HttpTime(MonoBehaviour mono)
    {
        mono.StartCoroutine(IEGetHTTP_Time(url1));
        /*
         StartCoroutine(IEGetHTTP_Time(url2));
         StartCoroutine(IEGetHTTP_Time(url3));
         StartCoroutine(IEGetHTTP_Time(url4));
         StartCoroutine(IEGetHTTP_Time(url5));
        */
    }

    IEnumerator IEGetHTTP_Time(string url)
    {
        while (true)
        {
            //Debug.Log("开始获取"+url +"的服务器时间(GMT DATE)");
            UnityWebRequest WebRequest = new UnityWebRequest(url);
            yield return WebRequest.SendWebRequest();

            //网页加载完成  并且下载过程中没有错误   string.IsNullOrEmpty 判断字符串是否是null 或者是" ",如果是返回true
            //WebRequest.error  下载过程中如果出现下载错误  会返回错误信息 如果下载没有完成那么将会阻塞到下载完成
            if (WebRequest.isDone && string.IsNullOrEmpty(WebRequest.error))
            {
                Dictionary<string, string> resHeaders = WebRequest.GetResponseHeaders();
                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;
                }

                //存储当前时间戳
                Timer_t._Action_SaveCurrentTime(GetTimeSqite(FormattingGMT(value).ToString()));

                //北京时间
                //Debug.Log(FormattingGMT(value).ToString());
            }
            yield return new WaitForSeconds(1);
        }
    }
    /// <summary>
    /// GMT(格林威治时间)时间转成本地时间
    /// </summary>
    /// <param name="gmt">字符串形式的GMT时间</param>
    /// <returns></returns>
    private DateTime FormattingGMT(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;
    }

    /// <summary>
    /// 返回的是一个时间数组,数组下标从0到最大代表了--- 年月日时分秒
    /// </summary>
    /// <param name="_str">传入一个时间的字符串</param>
    /// <returns></returns>
    private decimal GetTimeSqite(string _str)
    {
       string pattern4 = @"[ ]|[/]|[:]";
       //存储在数组中的顺序是年月日时分秒
       string[] timerArr = Regex.Split(_str, pattern4);

#if UNITY_IOS
       int[] timerNum = new int[timerArr.Length-1];
       for (int i = 0; i < timerArr.Length-1; i++)
       {
         timerNum[i] = int.Parse(timerArr[i]);
       }
#else
        int[] timerNum = new int[timerArr.Length];
        for (int i = 0; i < timerArr.Length; i++)
        {
            timerNum[i] = int.Parse(timerArr[i]);
        }
#endif
        return GetTimeStamp(timerNum);  
    }

    /// <summary>
    /// 获取时间戳
    /// </summary>
    private decimal GetTimeStamp(int[] time)
    {
        DateTime today = new DateTime(time[0], time[1], time[2], time[3], time[4], time[5]);
        DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));//这是历史最早的时间戳
        decimal t = (today.Ticks - startTime.Ticks) / 10000000;//得到了那个点的时间戳(这里用long好像会丢精度   建议decimal)
        return t;
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值