[펌] 타임서버에서 시각 가져와서 Unity 에서 사용하기 (NST, NIST)
Unity3D/Script / 2019. 4. 15. 14:04
NIST 타임서버에서 시간가져오기 (NST)
아래와 같은 코드로 가져올 수 있다.
Unity 에서 사용할 수 있다.
using System; using System.IO; using System.Collections; using System.Collections.Generic; using UnityEngine; public class TimeServer : MonoBehaviour { [SerializeField] private string _comment = "만료시킬 날짜를 적으세요 (한국시각 기준)"; public int _yyyy, _mm, _dd; private DateTime _expireDateTime, _nowServerDateTime, _nowLocalDateTime; private TimeSpan _duration; // Use this for initialization void Start () { // 한국 시각 _duration = System.TimeSpan.FromHours(9); _expireDateTime = new DateTime(Mathf.Clamp(_yyyy, 1900, 3000), Mathf.Clamp(_mm, 1,12), Mathf.Clamp(_dd, 1, 31)); _nowLocalDateTime = DateTime.Now; _nowServerDateTime = GetNISTDate().Add(_duration); if (Debug.isDebugBuild) { Debug.LogWarning("만료지정일 : " + _expireDateTime); Debug.LogWarning("현재 로컬 시각 :" + _nowLocalDateTime); Debug.LogWarning("현재 서버 시각 :" + _nowServerDateTime); } if (_nowLocalDateTime < _expireDateTime) { if (_nowServerDateTime < _expireDateTime) { // Debug.Log("실행"); } else { // Debug.Log("서버 체크 결과 만료 됨"); } } else { // Debug.Log("로컬 체크 결과 만료 됨"); } } #region NTPTIME //NTP time 을 NIST 에서 가져오기 // 4초 이내에 한번 이상 요청 하면, ip가 차단됩니다. public static DateTime GetDummyDate() { return new DateTime(2017, 12, 24); //to check if we have an online date or not. } public static DateTime GetNISTDate() { System.Random ran = new System.Random(DateTime.Now.Millisecond); DateTime date = GetDummyDate(); string serverResponse = string.Empty; // NIST 서버 목록 string[] servers = new string[] { "time.bora.net", //"time.nuri.net", //"ntp.kornet.net", //"time.kriss.re.kr", //"time.nist.gov", //"maths.kaist.ac.kr", "nist1-ny.ustiming.org", "time-a.nist.gov", "nist1-chi.ustiming.org", "time.nist.gov", "ntp-nist.ldsbc.edu", "nist1-la.ustiming.org" }; // 너무 많은 요청으로 인한 차단을 피하기 위해 한 서버씩 순환한다. 5번만 시도한다. for (int i = 0; i < 5; i++) { try { // StreamReader(무작위 서버) StreamReader reader = new StreamReader(new System.Net.Sockets.TcpClient(servers[ran.Next(0, servers.Length)], 13).GetStream()); serverResponse = reader.ReadToEnd(); reader.Close(); // 서버 리스폰스를 표시한다. (디버그 확인용) if (Debug.isDebugBuild) Debug.Log(serverResponse); // 시그니처가 있는지 확인한다. if (serverResponse.Length > 47 && serverResponse.Substring(38, 9).Equals("UTC(NIST)")) { // 날짜 파싱 int jd = int.Parse(serverResponse.Substring(1, 5)); int yr = int.Parse(serverResponse.Substring(7, 2)); int mo = int.Parse(serverResponse.Substring(10, 2)); int dy = int.Parse(serverResponse.Substring(13, 2)); int hr = int.Parse(serverResponse.Substring(16, 2)); int mm = int.Parse(serverResponse.Substring(19, 2)); int sc = int.Parse(serverResponse.Substring(22, 2)); if (jd > 51544) yr += 2000; else yr += 1999; date = new DateTime(yr, mo, dy, hr, mm, sc); // Exit the loop break; } } catch (Exception e) { /* 아무것도 하지 않고 다음 서버를 시도한다. */ } } return date; } #endregion }
아래 코드 원본에서 주석 변경 및 내가 사용하기 위해 수정함.
경로 : https://stackoverflow.com/questions/516788/getting-current-gmt-time
반응형
'Unity3D > Script' 카테고리의 다른 글
[펌] Enable Push Notification in XCode project by default? (0) | 2019.06.03 |
---|---|
[펌] animation.sample() usage (0) | 2019.05.09 |
[펌] Async-Await instead of coroutines in Unity 2017 (0) | 2019.02.21 |
[펌] 웹 페이지 상의 이미지를 읽어와 출력하기 (0) | 2018.12.21 |
[펌] Unity C# – Coroutine 알아보기 (0) | 2018.09.07 |