DateUtil.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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. /// <summary>
  139. /// DateTime时间格式转换为Unix时间戳格式
  140. /// </summary>
  141. /// <param name="time"> DateTime时间格式</param>
  142. /// <returns>Unix时间戳格式</returns>
  143. public static int ConvertDateTimeInt(System.DateTime time)
  144. {
  145. System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
  146. return (int)(time - startTime).TotalSeconds;
  147. }
  148. /// <summary>
  149. /// 从标准服务器获取当前正确时间,如果获取失败,则获取本地时间,并存在startStandardTime
  150. /// </summary>
  151. /// <param name="timeZone">时区</param>
  152. /// <returns>DateTime时间格式</returns>
  153. public static DateTime GetStandardTime(int timeZone = 8)
  154. {
  155. DateTime dt;
  156. //返回国际标准时间
  157. //只使用的时间服务器的IP地址,未使用域名
  158. try
  159. {
  160. string[,] timeServer = new string[14, 2];
  161. int[] searchOrder = new int[] { 3, 2, 4, 8, 9, 6, 11, 5, 10, 0, 1, 7, 12 };
  162. timeServer[0, 0] = "time-a.nist.gov";
  163. timeServer[0, 1] = "129.6.15.28";
  164. timeServer[1, 0] = "time-b.nist.gov";
  165. timeServer[1, 1] = "129.6.15.29";
  166. timeServer[2, 0] = "time-a.timefreq.bldrdoc.gov";
  167. timeServer[2, 1] = "132.163.4.101";
  168. timeServer[3, 0] = "time-b.timefreq.bldrdoc.gov";
  169. timeServer[3, 1] = "132.163.4.102";
  170. timeServer[4, 0] = "time-c.timefreq.bldrdoc.gov";
  171. timeServer[4, 1] = "132.163.4.103";
  172. timeServer[5, 0] = "utcnist.colorado.edu";
  173. timeServer[5, 1] = "128.138.140.44";
  174. timeServer[6, 0] = "time.nist.gov";
  175. timeServer[6, 1] = "192.43.244.18";
  176. timeServer[7, 0] = "time-nw.nist.gov";
  177. timeServer[7, 1] = "131.107.1.10";
  178. timeServer[8, 0] = "nist1.symmetricom.com";
  179. timeServer[8, 1] = "69.25.96.13";
  180. timeServer[9, 0] = "nist1-dc.glassey.com";
  181. timeServer[9, 1] = "216.200.93.8";
  182. timeServer[10, 0] = "nist1-ny.glassey.com";
  183. timeServer[10, 1] = "208.184.49.9";
  184. timeServer[11, 0] = "nist1-sj.glassey.com";
  185. timeServer[11, 1] = "207.126.98.204";
  186. timeServer[12, 0] = "nist1.aol-ca.truetime.com";
  187. timeServer[12, 1] = "207.200.81.113";
  188. timeServer[13, 0] = "nist1.aol-va.truetime.com";
  189. timeServer[13, 1] = "64.236.96.53";
  190. int portNum = 13;
  191. string hostName;
  192. byte[] bytes = new byte[1024];
  193. int bytesRead = 0;
  194. System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient();
  195. for (int i = 0; i < 13; i++)
  196. {
  197. hostName = timeServer[searchOrder[i], 1];
  198. try
  199. {
  200. client.Connect(hostName, portNum);
  201. System.Net.Sockets.NetworkStream ns = client.GetStream();
  202. bytesRead = ns.Read(bytes, 0, bytes.Length);
  203. client.Close();
  204. break;
  205. }
  206. catch (System.Exception)
  207. {
  208. }
  209. }
  210. char[] sp = new char[1];
  211. sp[0] = ' ';
  212. dt = new DateTime();
  213. string str1;
  214. str1 = System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRead);
  215. string[] s;
  216. s = str1.Split(sp);
  217. dt = DateTime.Parse(s[1] + " " + s[2]);//得到标准时间
  218. dt = dt.AddHours(timeZone);
  219. }
  220. catch (Exception)
  221. {
  222. dt = DateTime.Parse("1970-1-1");
  223. }
  224. if ((dt.ToString() != "1970-1-1 0:00:00"))
  225. startStandardTime = dt;
  226. else
  227. {
  228. Debuger.LogError("Can not get server time, use local instead!");
  229. startStandardTime = DateTime.Now;
  230. }
  231. localStandardTime = DateTime.Now;
  232. //Debuger.LogWarning("[Server Standard Time]" + standardTime);
  233. return dt;
  234. }
  235. /// <summary>
  236. /// 按照当前时间重新设置起始时间
  237. /// </summary>
  238. /// <param name="interval">设置可重置的时间差,单位为秒</param>
  239. public static void ResetStandardTime(int interval)
  240. {
  241. if(GetCurrentTimeByStandardTime() - ConvertDateTimeInt(pauseStandardTime) > interval && pauseStandardTime != new DateTime(1970, 1, 1))
  242. {
  243. startStandardTime = GetCurrenTimeByStandardTimeUseDateTime();
  244. pauseStandardTime = new DateTime(1970, 1, 1);
  245. }
  246. }
  247. /// <summary>
  248. /// 设置暂停时的时间
  249. /// </summary>
  250. public static void SetPauseStandardTime()
  251. {
  252. pauseStandardTime = GetCurrenTimeByStandardTimeUseDateTime();
  253. }
  254. /// <summary>
  255. /// 从打开游戏到当前所经历的秒数
  256. /// </summary>
  257. /// <returns>单位为秒</returns>
  258. public static int GetRealTimeSinceStart()
  259. {
  260. return ConvertDateTimeInt(DateTime.Now) - ConvertDateTimeInt(localStandardTime);
  261. }
  262. /// <summary>
  263. /// 获取当前标准时间的时间戳
  264. /// </summary>
  265. /// <returns>返回时间戳</returns>
  266. public static int GetCurrentTimeByStandardTime()
  267. {
  268. return GetRealTimeSinceStart() + ConvertDateTimeInt(startStandardTime);
  269. }
  270. /// <summary>
  271. /// 获取当前标准时间
  272. /// </summary>
  273. /// <returns>返回DateTime时间格式</returns>
  274. public static DateTime GetCurrenTimeByStandardTimeUseDateTime()
  275. {
  276. return GetTime(GetCurrentTimeByStandardTime().ToString());
  277. }
  278. /// <summary>
  279. /// 设置当前标准时间
  280. /// </summary>
  281. /// <param name="dateTime"></param>
  282. public static void SetStandardTime(DateTime dateTime)
  283. {
  284. startStandardTime = dateTime;
  285. localStandardTime = DateTime.Now;
  286. }
  287. /// <summary>
  288. /// 获取当前标准时间
  289. /// </summary>
  290. public static DateTime GetStandardTimeExist()
  291. {
  292. return startStandardTime; //todo 删掉这句 取消注释
  293. //if (startStandardTime != null)
  294. // return startStandardTime;
  295. //else
  296. // return DateTime.Now;
  297. }
  298. public static int GetStandardTimeExistByTimeStamp()
  299. {
  300. return ConvertDateTimeInt(GetStandardTimeExist());
  301. }
  302. }