TimeHelper.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. using System;
  2. using System.Linq;
  3. namespace Fort23.Core
  4. {
  5. public static class TimeHelper
  6. {
  7. public static int refreshHour = 0;
  8. public static readonly long epoch = 0;
  9. private static readonly DateTime ServerStartTime = new DateTime(2025, 4, 1, 0, 0, 0, DateTimeKind.Utc); // 服务器开服时间
  10. public static DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  11. public const long OneDay = 86400000;
  12. public const long Hour = 3600000;
  13. public const long Minute = 60000;
  14. private static long _clientFrame;
  15. public static long clientFrame
  16. {
  17. set => _clientFrame = value;
  18. }
  19. public static long GetServerStartTime()
  20. {
  21. return ((ServerStartTime.Ticks - epoch) / 10000) + (8 * 60 * 60 * 1000);
  22. }
  23. /// <summary>
  24. /// 用于唯一Id生成,不重复
  25. /// </summary>
  26. /// <returns></returns>
  27. public static long ClientNowMicroseconds()
  28. {
  29. return DateTime.UtcNow.Ticks - epoch;
  30. }
  31. /// <summary>
  32. /// 客户端非暂停状态经历的帧数对应的毫秒
  33. /// </summary>
  34. /// <returns></returns>
  35. public static long ClientFrame()
  36. {
  37. return _clientFrame;
  38. }
  39. /// <summary>
  40. /// 客户端时间(毫秒)
  41. /// </summary>
  42. /// <returns></returns>
  43. public static long ClientNow()
  44. {
  45. return ((DateTime.UtcNow.Ticks - epoch) / 10000) + (8 * 60 * 60 * 1000);
  46. }
  47. /// <summary>
  48. /// 客户端时间(秒)
  49. /// </summary>
  50. /// <returns></returns>
  51. public static long ClientNowSeconds()
  52. {
  53. return ClientNow() / 1000;
  54. }
  55. public static DateTime DateTimeNow()
  56. {
  57. return DateTime.Now;
  58. }
  59. /// <summary>
  60. /// 服务器时间(毫秒)
  61. /// </summary>
  62. /// <returns></returns>
  63. public static long ServerNow()
  64. {
  65. return ClientNow();
  66. }
  67. /// <summary>
  68. /// 服务器时间(秒)
  69. /// </summary>
  70. /// <returns></returns>
  71. public static long ServerNowSeconds()
  72. {
  73. return ClientNowSeconds();
  74. }
  75. /// <summary>
  76. /// 时间戳转字符串
  77. /// </summary>
  78. /// <param name="value"></param>
  79. /// <returns></returns>
  80. public static string ToHour(this int value)
  81. {
  82. int fen = value / 60;
  83. int hour = fen / 60;
  84. return (hour + 1) + "";
  85. }
  86. /// <summary>
  87. /// 客户端时间(年月日)
  88. /// </summary>
  89. /// <param name="timeStamp">当前时间</param>
  90. /// <returns></returns>
  91. public static int ClientNowInt(long timeStamp)
  92. {
  93. TimeSpan toNow = new TimeSpan(timeStamp * 10000);
  94. DateTime dateTime = dtStart.Add(toNow);
  95. int year = dateTime.Year;
  96. int month = dateTime.Month;
  97. int day = dateTime.Day;
  98. int date;
  99. string smouth = "";
  100. if (month >= 10)
  101. {
  102. smouth = month.ToString();
  103. }
  104. else
  105. {
  106. smouth = $"0{month}";
  107. }
  108. string sday = "";
  109. if (day >= 10)
  110. {
  111. sday = day.ToString();
  112. }
  113. else
  114. {
  115. sday = $"0{day}";
  116. }
  117. if (int.TryParse($"{year}{smouth}{sday}", out date))
  118. {
  119. return date;
  120. }
  121. return 20201010;
  122. }
  123. /// <summary>
  124. /// 客户端时间(月日时分秒)
  125. /// </summary>
  126. /// <param name="timeStamp">当前时间(毫秒)</param>
  127. /// <returns></returns>
  128. public static string ToString1(long timeStamp)
  129. {
  130. TimeSpan toNow = new TimeSpan(timeStamp * 10000);
  131. DateTime dateTime = dtStart.Add(toNow);
  132. string month = String.Empty;
  133. string day = String.Empty;
  134. string hour = String.Empty;
  135. string minute = String.Empty;
  136. string second = String.Empty;
  137. if (dateTime.Month >= 10)
  138. {
  139. month = dateTime.Month.ToString();
  140. }
  141. else
  142. {
  143. month = $"0{dateTime.Month}";
  144. }
  145. if (dateTime.Day >= 10)
  146. {
  147. day = dateTime.Day.ToString();
  148. }
  149. else
  150. {
  151. day = $"0{dateTime.Day}";
  152. }
  153. if (dateTime.Hour >= 10)
  154. {
  155. hour = dateTime.Hour.ToString();
  156. }
  157. else
  158. {
  159. hour = $"0{dateTime.Hour}";
  160. }
  161. if (dateTime.Minute >= 10)
  162. {
  163. minute = dateTime.Minute.ToString();
  164. }
  165. else
  166. {
  167. minute = $"0{dateTime.Minute}";
  168. }
  169. if (dateTime.Second >= 10)
  170. {
  171. second = dateTime.Second.ToString();
  172. }
  173. else
  174. {
  175. second = $"0{dateTime.Second}";
  176. }
  177. string result = $"{month}月{day}日{hour}:{minute}:{second}";
  178. return result;
  179. }
  180. /// <summary>
  181. /// 判断法定工作日和节假日
  182. /// </summary>
  183. /// <param name="dt">时间</param>
  184. /// <returns>0上班,1不需要上班的周末(也包括节假日),2法定节假日</returns>
  185. public static int IsHolidayOrWeekend(DateTime dt)
  186. {
  187. //特殊的周末(周末却上班)
  188. string[] specalWeek2022 = { };
  189. string[] specalWeek2023 = { "0128", "0129", "0214", "0429", "0430", "0625", "1007", "1008" };
  190. //法定假日
  191. string[] holiday2022 = { "1231" };
  192. string[] holiday2023 =
  193. {
  194. "0101", "0102", "0121", "0122", "0123", "0124", "0125", "0126", "0127", "0405", "0501", "0502", "0503", "0504", "0505", "0622", "0623",
  195. "0929", "1002", "1003", "1004", "1005", "1006"
  196. };
  197. bool isHoildayOrWeek = false;
  198. //取年
  199. string weekYear = dt.Year.ToString();
  200. //取月日
  201. string[] weekDate = { dt.ToString("MMdd") };
  202. //判断周末和周五
  203. if ((int)dt.DayOfWeek == 0 || (int)dt.DayOfWeek == 6 || (int)dt.DayOfWeek == 5)
  204. {
  205. //周末是否需要上班
  206. switch (weekYear)
  207. {
  208. case "2022":
  209. isHoildayOrWeek = specalWeek2022.Intersect(weekDate).Count() == 0;
  210. break;
  211. case "2023":
  212. isHoildayOrWeek = specalWeek2023.Intersect(weekDate).Count() == 0;
  213. break;
  214. }
  215. }
  216. if (isHoildayOrWeek)
  217. {
  218. return 1;
  219. }
  220. //判断法定节假日
  221. switch (weekYear)
  222. {
  223. case "2022":
  224. isHoildayOrWeek = holiday2022.Intersect(weekDate).Count() > 0;
  225. break;
  226. case "2023":
  227. isHoildayOrWeek = holiday2023.Intersect(weekDate).Count() > 0;
  228. break;
  229. }
  230. if (isHoildayOrWeek)
  231. {
  232. return 2;
  233. }
  234. return 0;
  235. }
  236. public static long GetBaseRefreshTime(long baseTime, int day = 1)
  237. {
  238. DateTime dateTime = DateTimeOffset.FromUnixTimeMilliseconds(baseTime).DateTime;
  239. int hour = dateTime.Hour;
  240. DateTime refreshDateTime = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, refreshHour, 0, 0, DateTimeKind.Utc);
  241. if (hour < refreshHour)
  242. {
  243. day -= 1;
  244. }
  245. refreshDateTime = refreshDateTime.AddDays(day);
  246. long refreshTime = new DateTimeOffset(refreshDateTime).ToUnixTimeMilliseconds();
  247. return refreshTime;
  248. }
  249. }
  250. }