DateUtil.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. using System;
  2. using System.Globalization;
  3. public class DateUtil
  4. {
  5. private static DateTime startStandardTime;
  6. private static DateTime pauseStandardTime = new DateTime(1970, 1, 1);
  7. private static DateTime localStandardTime;
  8. //如果12月31号与下一年的1月1好在同一个星期则算下一年的第一周
  9. public static int GetWeekIndex(DateTime dTime)
  10. {
  11. try
  12. {
  13. //确定此时间在一年中的位置
  14. var dayOfYear = dTime.DayOfYear;
  15. //当年第一天
  16. var tempDate = new DateTime(dTime.Year, 1, 1);
  17. //确定当年第一天
  18. var tempDayOfWeek = (int)tempDate.DayOfWeek;
  19. tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek;
  20. //确定星期几
  21. var index = (int)dTime.DayOfWeek;
  22. index = index == 0 ? 7 : index;
  23. //当前周的范围
  24. DateTime retStartDay = dTime.AddDays(-(index - 1));
  25. DateTime retEndDay = dTime.AddDays(7 - index);
  26. //确定当前是第几周
  27. var weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7);
  28. if (retStartDay.Year < retEndDay.Year)
  29. {
  30. weekIndex = 1;
  31. }
  32. return weekIndex;
  33. }
  34. catch (Exception ex)
  35. {
  36. throw new Exception(ex.Message);
  37. }
  38. }
  39. public static int GetWeekIndex(string strDate)
  40. {
  41. try
  42. {
  43. //需要判断的时间
  44. DateTime dTime = Convert.ToDateTime(strDate);
  45. return GetWeekIndex(dTime);
  46. }
  47. catch (Exception ex)
  48. {
  49. throw new Exception(ex.Message);
  50. }
  51. }
  52. /// <summary>
  53. /// 用年份和第几周来获得一周开始和结束的时间,这里用星期一做开始。
  54. /// </summary>
  55. public static void GetWeek(int year, int weekNum, out DateTime weekStart, out DateTime weekeEnd)
  56. {
  57. var dateTime = new DateTime(year, 1, 1);
  58. dateTime = dateTime.AddDays(7 * weekNum);
  59. weekStart = dateTime.AddDays(-(int)dateTime.DayOfWeek + (int)DayOfWeek.Monday);
  60. weekeEnd = dateTime.AddDays((int)DayOfWeek.Saturday - (int)dateTime.DayOfWeek + 1);
  61. }
  62. /// <summary> 求某年有多少周
  63. /// </summary>
  64. public static int GetYearWeekCount(int year)
  65. {
  66. var dateTime = DateTime.Parse(year + "-01-01");
  67. var firstDayOfWeek = Convert.ToInt32(dateTime.DayOfWeek);//得到该年的第一天是周几
  68. if (firstDayOfWeek == 1)
  69. {
  70. var countDay = dateTime.AddYears(1).AddDays(-1).DayOfYear;
  71. var countWeek = countDay / 7 + 1;
  72. return countWeek;
  73. }
  74. else
  75. {
  76. var countDay = dateTime.AddYears(1).AddDays(-1).DayOfYear;
  77. var countWeek = countDay / 7 + 2;
  78. return countWeek;
  79. }
  80. }
  81. /// <summary>
  82. /// 求当前日期是一年的中第几周
  83. /// </summary>
  84. public static int WeekOfYear(DateTime todayTime)
  85. {
  86. var firstdayofweek = Convert.ToInt32(Convert.ToDateTime(todayTime.Year.ToString(CultureInfo.InvariantCulture) + "- " + "1-1 ").DayOfWeek);
  87. var days = todayTime.DayOfYear;
  88. var daysOutOneWeek = days - (7 - firstdayofweek);
  89. if (daysOutOneWeek <= 0)
  90. {
  91. return 1;
  92. }
  93. var weeks = daysOutOneWeek / 7;
  94. if (daysOutOneWeek % 7 != 0)
  95. weeks++;
  96. return weeks + 1;
  97. }
  98. /// <summary>
  99. /// 当前月有多少天
  100. /// </summary>
  101. public static int HowMonthDay(int year, int month)
  102. {
  103. int next_month;
  104. int next_year;
  105. if (month < 12)
  106. {
  107. next_month = month + 1;
  108. next_year = year;
  109. }
  110. else
  111. {
  112. next_month = 1;
  113. next_year = year + 1;
  114. }
  115. DateTime dt1 = Convert.ToDateTime(year + "-" + month + "-1");
  116. DateTime dt2 = Convert.ToDateTime(next_year + "-" + next_month + "-1");
  117. TimeSpan diff = dt2 - dt1;
  118. return diff.Days;
  119. }
  120. //get day in week by hashcode
  121. private static Array dayOfWeekArr = Enum.GetValues(typeof(DayOfWeek));
  122. public static DayOfWeek GetDayOfWeekByHashCode(int code)
  123. {
  124. return (DayOfWeek)dayOfWeekArr.GetValue(code);
  125. }
  126. /// <summary>
  127. /// 时间戳转为C#格式时间
  128. /// </summary>
  129. /// <param name="timeStamp">Unix时间戳格式</param>
  130. /// <returns>C#格式时间</returns>
  131. public static DateTime GetTime(string timeStamp)
  132. {
  133. DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  134. long lTime = long.Parse(timeStamp + "0000000");
  135. TimeSpan toNow = new TimeSpan(lTime);
  136. return dtStart.Add(toNow);
  137. }
  138. public static DateTime GetTimeFromSeconds(string timeStamp)
  139. {
  140. DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  141. long lTime = long.Parse(timeStamp + "0000");
  142. TimeSpan toNow = new TimeSpan(lTime);
  143. return dtStart.Add(toNow);
  144. }
  145. public static DateTime GetTimeFromMiliseconds(string timeStamp)
  146. {
  147. DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  148. long lTime = long.Parse(timeStamp);
  149. TimeSpan toNow = new TimeSpan(lTime);
  150. return dtStart.Add(toNow);
  151. }
  152. /// <summary>
  153. /// DateTime时间格式转换为Unix时间戳格式
  154. /// </summary>
  155. /// <param name="time"> DateTime时间格式</param>
  156. /// <returns>Unix时间戳格式</returns>
  157. public static int ConvertDateTimeInt(System.DateTime time)
  158. {
  159. System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
  160. return (int)(time - startTime).TotalSeconds;
  161. }
  162. /// <summary>
  163. /// 从标准服务器获取当前正确时间,如果获取失败,则获取本地时间,并存在startStandardTime
  164. /// </summary>
  165. /// <param name="timeZone">时区</param>
  166. /// <returns>DateTime时间格式</returns>
  167. public static DateTime GetStandardTime(int timeZone = 8)
  168. {
  169. DateTime dt;
  170. //返回国际标准时间
  171. //只使用的时间服务器的IP地址,未使用域名
  172. try
  173. {
  174. string[,] timeServer = new string[14, 2];
  175. int[] searchOrder = new int[] { 3, 2, 4, 8, 9, 6, 11, 5, 10, 0, 1, 7, 12 };
  176. timeServer[0, 0] = "time-a.nist.gov";
  177. timeServer[0, 1] = "129.6.15.28";
  178. timeServer[1, 0] = "time-b.nist.gov";
  179. timeServer[1, 1] = "129.6.15.29";
  180. timeServer[2, 0] = "time-a.timefreq.bldrdoc.gov";
  181. timeServer[2, 1] = "132.163.4.101";
  182. timeServer[3, 0] = "time-b.timefreq.bldrdoc.gov";
  183. timeServer[3, 1] = "132.163.4.102";
  184. timeServer[4, 0] = "time-c.timefreq.bldrdoc.gov";
  185. timeServer[4, 1] = "132.163.4.103";
  186. timeServer[5, 0] = "utcnist.colorado.edu";
  187. timeServer[5, 1] = "128.138.140.44";
  188. timeServer[6, 0] = "time.nist.gov";
  189. timeServer[6, 1] = "192.43.244.18";
  190. timeServer[7, 0] = "time-nw.nist.gov";
  191. timeServer[7, 1] = "131.107.1.10";
  192. timeServer[8, 0] = "nist1.symmetricom.com";
  193. timeServer[8, 1] = "69.25.96.13";
  194. timeServer[9, 0] = "nist1-dc.glassey.com";
  195. timeServer[9, 1] = "216.200.93.8";
  196. timeServer[10, 0] = "nist1-ny.glassey.com";
  197. timeServer[10, 1] = "208.184.49.9";
  198. timeServer[11, 0] = "nist1-sj.glassey.com";
  199. timeServer[11, 1] = "207.126.98.204";
  200. timeServer[12, 0] = "nist1.aol-ca.truetime.com";
  201. timeServer[12, 1] = "207.200.81.113";
  202. timeServer[13, 0] = "nist1.aol-va.truetime.com";
  203. timeServer[13, 1] = "64.236.96.53";
  204. int portNum = 13;
  205. string hostName;
  206. byte[] bytes = new byte[1024];
  207. int bytesRead = 0;
  208. System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient();
  209. for (int i = 0; i < 13; i++)
  210. {
  211. hostName = timeServer[searchOrder[i], 1];
  212. try
  213. {
  214. client.Connect(hostName, portNum);
  215. System.Net.Sockets.NetworkStream ns = client.GetStream();
  216. bytesRead = ns.Read(bytes, 0, bytes.Length);
  217. client.Close();
  218. break;
  219. }
  220. catch (System.Exception)
  221. {
  222. }
  223. }
  224. char[] sp = new char[1];
  225. sp[0] = ' ';
  226. dt = new DateTime();
  227. string str1;
  228. str1 = System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRead);
  229. string[] s;
  230. s = str1.Split(sp);
  231. dt = DateTime.Parse(s[1] + " " + s[2]);//得到标准时间
  232. dt = dt.AddHours(timeZone);
  233. }
  234. catch (Exception)
  235. {
  236. dt = DateTime.Parse("1970-1-1");
  237. }
  238. if ((dt.ToString() != "1970-1-1 0:00:00"))
  239. startStandardTime = dt;
  240. else
  241. {
  242. Debuger.LogError("Can not get server time, use local instead!");
  243. startStandardTime = DateTime.Now;
  244. }
  245. localStandardTime = DateTime.Now;
  246. //Debuger.LogWarning("[Server Standard Time]" + standardTime);
  247. return dt;
  248. }
  249. /// <summary>
  250. /// 按照当前时间重新设置起始时间
  251. /// </summary>
  252. /// <param name="interval">设置可重置的时间差,单位为秒</param>
  253. public static void ResetStandardTime(int interval)
  254. {
  255. if(GetCurrentTimeByStandardTime() - ConvertDateTimeInt(pauseStandardTime) > interval && pauseStandardTime != new DateTime(1970, 1, 1))
  256. {
  257. startStandardTime = GetCurrenTimeByStandardTimeUseDateTime();
  258. pauseStandardTime = new DateTime(1970, 1, 1);
  259. }
  260. }
  261. /// <summary>
  262. /// 设置暂停时的时间
  263. /// </summary>
  264. public static void SetPauseStandardTime()
  265. {
  266. pauseStandardTime = GetCurrenTimeByStandardTimeUseDateTime();
  267. }
  268. /// <summary>
  269. /// 从打开游戏到当前所经历的秒数
  270. /// </summary>
  271. /// <returns>单位为秒</returns>
  272. public static int GetRealTimeSinceStart()
  273. {
  274. return ConvertDateTimeInt(DateTime.Now) - ConvertDateTimeInt(localStandardTime);
  275. }
  276. /// <summary>
  277. /// 获取当前标准时间的时间戳
  278. /// </summary>
  279. /// <returns>返回时间戳</returns>
  280. public static int GetCurrentTimeByStandardTime()
  281. {
  282. return GetRealTimeSinceStart() + ConvertDateTimeInt(startStandardTime);
  283. }
  284. /// <summary>
  285. /// 获取当前标准时间
  286. /// </summary>
  287. /// <returns>返回DateTime时间格式</returns>
  288. public static DateTime GetCurrenTimeByStandardTimeUseDateTime()
  289. {
  290. return GetTime(GetCurrentTimeByStandardTime().ToString());
  291. }
  292. /// <summary>
  293. /// 设置当前标准时间
  294. /// </summary>
  295. /// <param name="dateTime"></param>
  296. public static void SetStandardTime(DateTime dateTime)
  297. {
  298. startStandardTime = dateTime;
  299. localStandardTime = DateTime.Now;
  300. }
  301. /// <summary>
  302. /// 获取当前标准时间
  303. /// </summary>
  304. public static DateTime GetStandardTimeExist()
  305. {
  306. return startStandardTime;
  307. //if (startStandardTime != null)
  308. // return startStandardTime;
  309. //else
  310. // return DateTime.Now;
  311. }
  312. public static int GetStandardTimeExistByTimeStamp()
  313. {
  314. return ConvertDateTimeInt(GetStandardTimeExist());
  315. }
  316. }