ServerUtils.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. using DeepCore.Reflection;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Dynamic;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.Text;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. namespace DeepCrystal
  13. {
  14. public static class ServerUtils
  15. {
  16. public static ExpandoObject ShallowCloneExpando(ExpandoObject original)
  17. {
  18. var clone = new ExpandoObject();
  19. var _original = (IDictionary<string, object>) original;
  20. var _clone = (IDictionary<string, object>) clone;
  21. foreach (var kvp in _original)
  22. _clone.Add(kvp);
  23. return clone;
  24. }
  25. public static ExpandoObject FromProperteis(DeepCore.Properties prop)
  26. {
  27. ExpandoObject ret = new ExpandoObject();
  28. foreach (var e in prop)
  29. {
  30. ((IDictionary<string, object>) ret).Add(e.Key, e.Value);
  31. }
  32. return ret;
  33. }
  34. public static DeepCore.Properties ToProperteis(ExpandoObject prop)
  35. {
  36. DeepCore.Properties ret = new DeepCore.Properties();
  37. foreach (var e in prop)
  38. {
  39. ret.Add(e.Key, e.Value + "");
  40. }
  41. return ret;
  42. }
  43. public static object DynamicToObject(dynamic src, Type dtype)
  44. {
  45. try
  46. {
  47. if (dtype.IsPrimitive || dtype==(typeof(string)))
  48. {
  49. //return Convert.ChangeType(src, dtype);
  50. return null;
  51. }
  52. else if (dtype.IsEnum)
  53. {
  54. //return Enum.Parse(dtype, src.ToString());
  55. return null;
  56. }
  57. else if (dtype.IsArray)
  58. {
  59. ArrayList temp = new ArrayList();
  60. var elementType = dtype.GetElementType();
  61. //foreach (dynamic sitem in src)
  62. //{
  63. // //var ditem = DynamicToObject(sitem, elementType);
  64. // //temp.Add(ditem);
  65. //}
  66. Array dfv = ReflectionUtil.CreateInstance(dtype, temp.Count) as Array;
  67. for (int i = 0; i < temp.Count; i++)
  68. {
  69. dfv.SetValue(temp[i], i);
  70. }
  71. return dfv;
  72. }
  73. else if (dtype.GetInterface(typeof(IList).Name) != null)
  74. {
  75. var dfv = ReflectionUtil.CreateInstance(dtype) as IList;
  76. var elementType = dtype.GetGenericArguments()[0];
  77. //foreach (dynamic sitem in src)
  78. //{
  79. // var ditem = DynamicToObject(sitem, elementType);
  80. // dfv.Add(ditem);
  81. //}
  82. return dfv;
  83. }
  84. else
  85. {
  86. var dst = ReflectionUtil.CreateInstance(dtype);
  87. //foreach (var f in dtype.GetFields())
  88. //{
  89. // dynamic sfv = src[f.Name];
  90. // if (sfv != null)
  91. // {
  92. // var ditem = DynamicToObject(sfv, f.FieldType);
  93. // f.SetValue(dst, ditem);
  94. // }
  95. //}
  96. return dst;
  97. }
  98. }
  99. catch (Exception err)
  100. {
  101. Console.WriteLine(err.Message);
  102. return null;
  103. }
  104. }
  105. /// <summary>
  106. /// 随机一次
  107. /// </summary>
  108. /// <typeparam name="T"></typeparam>
  109. /// <param name="arr"></param>
  110. /// <param name="weight"></param>
  111. /// <returns></returns>
  112. public static T GetRandomList<T>(T[] arr, int[] weight = null, Random random = null)
  113. {
  114. var ret = GetRandomList(arr, 1, weight,random);
  115. if (ret != null)
  116. {
  117. return ret[0];
  118. }
  119. return default(T);
  120. }
  121. /// <summary>
  122. /// 简单随机算法,可指定每项权重
  123. /// </summary>
  124. /// <typeparam name="T"></typeparam>
  125. /// <param name="list"></param>
  126. /// <param name="count"></param>
  127. /// <param name="weight"></param>
  128. /// <returns></returns>
  129. public static T[] GetRandomList<T>(T[] arr, int count, int[] weight = null, Random ran = null)
  130. {
  131. if (arr == null || arr.Length == 0)
  132. {
  133. return null;
  134. }
  135. var totalWeight = 0;
  136. int[] numArr = null;
  137. if (weight != null && weight.Length == arr.Length)
  138. {
  139. var currentIndex = 0;
  140. numArr = new int[weight.Length];
  141. for (var i = 0; i < weight.Length; i++)
  142. {
  143. totalWeight += weight[i];
  144. if (weight[i] == 0)
  145. {
  146. numArr[i] = 0;
  147. }
  148. else
  149. {
  150. numArr[i] = currentIndex + weight[i];
  151. currentIndex = numArr[i];
  152. }
  153. }
  154. }
  155. if (ran == null)
  156. {
  157. ran = new Random();
  158. }
  159. var ret = new T[count];
  160. for (var i = 0; i < count; i++)
  161. {
  162. if (totalWeight > 0)
  163. {
  164. var num = ran.Next(0, totalWeight);
  165. for (var j = 0; j < numArr.Length; j++)
  166. {
  167. if (num < numArr[j])
  168. {
  169. ret[i] = arr[j];
  170. break;
  171. }
  172. }
  173. }
  174. else
  175. {
  176. var index = ran.Next(0, arr.Length);
  177. ret[i] = arr[index];
  178. }
  179. }
  180. return ret;
  181. }
  182. /// <summary>
  183. /// 获得当天内指定时间戳.
  184. /// </summary>
  185. /// <param name="hour"></param>
  186. /// <param name="minute"></param>
  187. /// <returns>DateTime</returns>
  188. public static DateTime GetTodayTimeStampUTC(int hour, int minute)
  189. {
  190. var Today = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
  191. Today = Today.AddHours(hour).AddMinutes(minute);
  192. if ((DateTime.Now - Today).TotalSeconds < 0)
  193. {
  194. return Today.ToUniversalTime();
  195. }
  196. else
  197. {
  198. return Today.AddHours(24).ToUniversalTime();
  199. }
  200. }
  201. /// <summary>
  202. /// 获取当前时间到该周某一天的到期时间戳.
  203. /// </summary>
  204. /// <param name="w"></param>
  205. /// <param name="hour"></param>
  206. /// <param name="minute"></param>
  207. /// <returns></returns>
  208. public static DateTime GetTimeOfWeekTimeStampUTC(DayOfWeek w, int hour, int minute)
  209. {
  210. var today = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour, minute, 0);
  211. var off = w - today.DayOfWeek;
  212. DateTime dt;
  213. if (off > 0)
  214. {
  215. dt = today.AddDays(off);
  216. }
  217. else
  218. {
  219. dt = today.AddDays(7 + off);
  220. }
  221. return dt.ToUniversalTime();
  222. }
  223. /// <summary>
  224. /// 获取每月结算日的到期时间戳.
  225. /// </summary>
  226. /// <param name="hour"></param>
  227. /// <param name="minute"></param>
  228. /// <returns></returns>
  229. public static DateTime GetLastDayOfMonthTimeStampUTC(int hour, int minute)
  230. {
  231. var dt = LastDayOfCurMonth();
  232. dt = dt.AddHours(hour).AddMinutes(minute).AddSeconds(1);
  233. return dt.ToUniversalTime();
  234. }
  235. /// <summary>
  236. /// 获取到目标时间点的时差.
  237. /// </summary>
  238. /// <param name="hour"></param>
  239. /// <returns></returns>
  240. public static TimeSpan GetTimeSpanToNextTimeOfDay(int hour, int minute)
  241. {
  242. var today = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, DateTime.UtcNow.Hour, 0, 0);
  243. DateTime target = GetTodayTimeStampUTC(hour, minute);
  244. return target - today;
  245. }
  246. /// <summary>
  247. /// 获取当前时间到一周内某一天的时间差.
  248. /// </summary>
  249. /// <param name="w"></param>
  250. /// <param name="hour"></param>
  251. /// <param name="minute"></param>
  252. /// <returns></returns>
  253. public static TimeSpan GetTimeSpanToTimeOfWeek(DayOfWeek w, int hour, int minute)
  254. {
  255. var today = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour, minute, 0);
  256. var off = w - today.DayOfWeek;
  257. DateTime dt;
  258. if (off > 0)
  259. {
  260. dt = today.AddDays(off);
  261. }
  262. else
  263. {
  264. dt = today.AddDays(7 + off);
  265. }
  266. return dt - today;
  267. }
  268. /// <summary>
  269. /// 获取某月的最后一天59分59秒
  270. /// </summary>
  271. /// <param name="datetime">要取得月份的某一天</param>
  272. /// <returns></returns>
  273. public static DateTime LastDayOfCurMonth()
  274. {
  275. DateTime datetime = DateTime.Now;
  276. return DateTime.Parse(datetime.AddDays(1 - datetime.Day).AddMonths(1).ToShortDateString()).AddSeconds(-1);
  277. }
  278. /// <summary>
  279. /// 获取每月结算日所剩时间.
  280. /// </summary>
  281. /// <param name="hour"></param>
  282. /// <param name="minute"></param>
  283. /// <returns></returns>
  284. public static TimeSpan GetTimeSpanToLastDayOfMonth(int hour, int minute)
  285. {
  286. var dt = LastDayOfCurMonth();
  287. dt = dt.AddHours(hour).AddMinutes(minute).AddSeconds(1);
  288. return dt - DateTime.Now;
  289. }
  290. /// <summary>
  291. /// 是否过期.
  292. /// </summary>
  293. /// <param name="UTCtimeStamp"></param>
  294. /// <returns></returns>
  295. public static bool IsExpired(DateTime UTCtimeStamp)
  296. {
  297. var ret = DateTime.UtcNow - UTCtimeStamp;
  298. return (ret.TotalMilliseconds > 0);
  299. }
  300. /// <summary>
  301. /// 是否开始
  302. /// </summary>
  303. /// <param name="starTime"></param>
  304. /// <returns></returns>
  305. public static bool IsStarted(string starTime)
  306. {
  307. if (!string.IsNullOrEmpty(starTime) && DateTime.TryParse(starTime, out DateTime starDate))
  308. {
  309. // 对于开始时间来说 过期了代表开始
  310. return ServerUtils.IsExpired(starDate.ToUniversalTime());
  311. }
  312. return true;
  313. }
  314. /// <summary>
  315. /// 是否结束
  316. /// </summary>
  317. /// <param name="endTime"></param>
  318. /// <returns></returns>
  319. public static bool IsEnded(string endTime)
  320. {
  321. if (!string.IsNullOrEmpty(endTime) && DateTime.TryParse(endTime, out DateTime endDate))
  322. {
  323. // 过期了代表结束
  324. return ServerUtils.IsExpired(endDate.ToUniversalTime());
  325. }
  326. return false;
  327. }
  328. public static bool IsOpening(string starTime,string endTime)
  329. {
  330. // 已开始且没结束
  331. if(IsStarted(starTime) && !IsEnded(endTime))
  332. {
  333. return true;
  334. }
  335. return false;
  336. }
  337. /// <summary>
  338. /// 百分比随机,v/1000000.0f
  339. /// </summary>
  340. /// <param name="random"></param>
  341. /// <param name="v"></param>
  342. /// <returns></returns>
  343. public static bool RandomWithMillionPer(Random random,int v)
  344. {
  345. float rd = v / 1000000.0f;
  346. var r = random.NextDouble();
  347. return r < rd;
  348. }
  349. }
  350. }