TimeUtil.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using ET;
  5. namespace GFGGame
  6. {
  7. public partial class TimeUtil
  8. {
  9. public static int HOURS_PER_DAY = 24; //每天的小时数
  10. public static int MUNITE_PER_HOUR = 60; //每小时的分钟数
  11. public static int SECOND_PER_MUNITE = 60; //每分钟的秒数
  12. public static long SECOND_PER_HOUR = 3600; //一小时的秒数
  13. public static long SECOND_PER_DAY = 86400; //一天的秒数
  14. public static long SECOND_PER_WEEK = 604800; //一个星期的妙数
  15. public static long FIRST_YEAR_ZERO_POINT_MUNITE = 57600; //计算机元年第二天的0点,即1970-01-02 00:00:00的时间戳 57600 秒级
  16. //NextZeroTime
  17. public static int NextZeroSecs
  18. {
  19. get
  20. {
  21. //转换为时间对象必须使用此接口
  22. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  23. var todayZero = new DateTime(current.Year, current.Month, current.Day, 0, 0, 0);
  24. if (current.Ticks < todayZero.Ticks)
  25. {
  26. //转换为时间戳必须使用此接口
  27. return (int)(TimeInfo.Instance.Transition(todayZero) / 1000);
  28. }
  29. var timeSpan = new TimeSpan(24, 0, 0);
  30. var tomorrowZero = todayZero.Add(timeSpan);
  31. return (int)(TimeInfo.Instance.Transition(tomorrowZero) / 1000);
  32. }
  33. }
  34. public static int NextResetSecs
  35. {
  36. get
  37. {
  38. //转换为时间对象必须使用此接口
  39. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  40. var today5 = new DateTime(current.Year, current.Month, current.Day, GameConst.DAILY_RESET_HOUR, 0, 0);
  41. if (current.Ticks < today5.Ticks)
  42. {
  43. //转换为时间戳必须使用此接口
  44. return (int)(TimeInfo.Instance.Transition(today5) / 1000);
  45. }
  46. TimeSpan timeSpan = new TimeSpan(24, 0, 0);
  47. var tomorrow5 = today5.Add(timeSpan);
  48. return (int)(TimeInfo.Instance.Transition(tomorrow5) / 1000);
  49. }
  50. }
  51. public static int NextWeekSecs
  52. {
  53. get
  54. {
  55. var current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  56. var monday = current.AddDays(-(int)current.DayOfWeek + 1).Date;
  57. var mondayFive = monday.AddHours(GameConst.DAILY_RESET_HOUR);
  58. if (current.Ticks < mondayFive.Ticks)
  59. {
  60. //转换为时间戳必须使用此接口
  61. return (int)(TimeInfo.Instance.Transition(mondayFive) / 1000);
  62. }
  63. mondayFive = mondayFive.AddDays(7);
  64. return (int)(TimeInfo.Instance.Transition(mondayFive) / 1000);
  65. }
  66. }
  67. public static int NextMouthSecs
  68. {
  69. get
  70. {
  71. var current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  72. var firstDay = current.AddDays(1 - current.Day).Date;
  73. var firstDayFive = firstDay.AddHours(GameConst.DAILY_RESET_HOUR);
  74. if (current.Ticks < firstDayFive.Ticks)
  75. {
  76. //转换为时间戳必须使用此接口
  77. return (int)(TimeInfo.Instance.Transition(firstDayFive) / 1000);
  78. }
  79. firstDayFive = firstDayFive.AddMonths(1);
  80. return (int)(TimeInfo.Instance.Transition(firstDayFive) / 1000);
  81. }
  82. }
  83. public static int NextYearSecs
  84. {
  85. get
  86. {
  87. var current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  88. var firstDay = current.AddDays(1 - current.DayOfYear).Date;
  89. var firstDayFive = firstDay.AddHours(GameConst.DAILY_RESET_HOUR);
  90. if (current.Ticks < firstDayFive.Ticks)
  91. {
  92. //转换为时间戳必须使用此接口
  93. return (int)(TimeInfo.Instance.Transition(firstDayFive) / 1000);
  94. }
  95. firstDayFive = firstDayFive.AddYears(1);
  96. return (int)(TimeInfo.Instance.Transition(firstDayFive) / 1000);
  97. }
  98. }
  99. public static long TodayRestTime()
  100. {
  101. var current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  102. var today5 = new DateTime(current.Year, current.Month, current.Day, GameConst.DAILY_RESET_HOUR, 0, 0);
  103. //转换为时间戳必须使用此接口
  104. return TimeInfo.Instance.Transition(today5);
  105. }
  106. //星期天是0,依次递增
  107. public static bool CheckDayOfWeek(int dayOfWeek)
  108. {
  109. //转换为时间对象必须使用此接口
  110. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  111. if ((int)current.DayOfWeek == dayOfWeek)
  112. {
  113. return true;
  114. }
  115. return false;
  116. }
  117. //星期天是0,依次递增
  118. public static bool CheckDayOfWeek(int[] dayOfWeeks)
  119. {
  120. if (dayOfWeeks.Length == 0)
  121. {
  122. return true;
  123. }
  124. //转换为时间对象必须使用此接口
  125. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  126. foreach (var dayOfWeek in dayOfWeeks)
  127. {
  128. if ((int)current.DayOfWeek == dayOfWeek)
  129. {
  130. return true;
  131. }
  132. }
  133. return false;
  134. }
  135. public static bool CheckDayOfWeek(List<int> dayOfWeeks)
  136. {
  137. if (dayOfWeeks.Count == 0)
  138. {
  139. return true;
  140. }
  141. //转换为时间对象必须使用此接口
  142. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  143. foreach (var dayOfWeek in dayOfWeeks)
  144. {
  145. if ((int)current.DayOfWeek == dayOfWeek)
  146. {
  147. return true;
  148. }
  149. }
  150. return false;
  151. }
  152. //检测两个时间是否为同一天
  153. public static bool CheckIsSameTime(long time1, long time2)
  154. {
  155. DateTime date1 = TimeInfo.Instance.ToDateTime(time1);
  156. string str1 = date1.ToString("yyyy-MM-dd ");
  157. DateTime date2 = TimeInfo.Instance.ToDateTime(time2);
  158. string str2 = date2.ToString("yyyy-MM-dd ");
  159. return str1 == str2;
  160. }
  161. /// <summary>
  162. /// 检测两个时间是否为同一天(秒时间戳入参)
  163. /// </summary>
  164. /// <param name="time1"></param>
  165. /// <param name="time2"></param>
  166. /// <returns></returns>
  167. public static bool CheckIsSameTimeExt(long time1, long time2)
  168. {
  169. long daysDifference = DaysDifference(time1, time2);
  170. if (daysDifference == 0)
  171. {
  172. return true;
  173. }
  174. else
  175. {
  176. return false;
  177. }
  178. }
  179. //两个时间戳的差值天数(秒 时间戳入参),结果为正负,假设:time1 < time2 的话,差值为-1
  180. public static long DaysDifference(long time1, long time2)
  181. {
  182. //先设置一个计算机元年第二天的0点,即1970-01-02 00:00:00的时间戳(FIRST_YEAR_ZERO_POINT_MUNITE=57600,有两个时间戳字段x和y,假设x和y满足,(x - m) / 86400 - (y - m) / 86400 = 0,即x和y处在同一天。(其中 / 表示整除)
  183. return (time1 - FIRST_YEAR_ZERO_POINT_MUNITE) / SECOND_PER_DAY -
  184. (time2 - FIRST_YEAR_ZERO_POINT_MUNITE) / SECOND_PER_DAY;
  185. }
  186. //检查今天是否是指定日子
  187. public static bool CheckDayOfMonth(int dayOfMonth)
  188. {
  189. //转换为时间对象必须使用此接口
  190. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  191. if ((int)current.Day == dayOfMonth)
  192. {
  193. return true;
  194. }
  195. return false;
  196. }
  197. /// <summary>
  198. ///判断是否在当前服务器时间之前
  199. /// </summary>
  200. /// <param name="time"> 策划配置时间串 格式 [年][月][日][时:分]</param>
  201. /// <param name="isSame">是否检查时间相等, 默认不检查</param>
  202. /// <returns></returns>
  203. public static bool IsBeforeCurTime(string time, bool isSame = false)
  204. {
  205. if (time.Contains("24:00:00"))
  206. {
  207. time = time.Replace("24:00:00", "23:59:59");
  208. }
  209. if (time.Contains("24:00"))
  210. {
  211. time = time.Replace("24:00", "23:59:59");
  212. }
  213. DateTime date = GetDateTime(time);
  214. // if (time.EndsWith("24:00:00"))
  215. // {
  216. // time = time.Substring(0, time.Length - 8) + " 23:59:59";
  217. // }
  218. // DateTime date = DateTime.Parse(time);
  219. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  220. if (isSame)
  221. {
  222. return date <= current;
  223. }
  224. return date < current;
  225. }
  226. /// <summary>
  227. /// 判断是否在当前服务器时间之后
  228. /// </summary>
  229. /// <param name="time"></param>
  230. /// <returns></returns>
  231. public static bool IsLaterCurTime(string time)
  232. {
  233. if (time.Contains("24:00:00"))
  234. {
  235. time = time.Replace("24:00:00", "23:59:59");
  236. }
  237. if (time.Contains("24:00"))
  238. {
  239. time = time.Replace("24:00", "23:59");
  240. }
  241. DateTime date = GetDateTime(time);
  242. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  243. return date > current;
  244. }
  245. /// <summary>
  246. /// 将utc时间转换成时间戳
  247. /// </summary>
  248. /// <param name="time"></param>
  249. /// <returns></returns>
  250. public static long DateTimeToTimestamp(string time)
  251. {
  252. // if (time.EndsWith("24:00:00"))
  253. // {
  254. // time = time.Substring(0, time.Length - 8) + " 23:59:59";
  255. // }
  256. //
  257. // DateTime date = DateTime.Parse(time);
  258. if (time.Contains("24:00:00"))
  259. {
  260. time = time.Replace("24:00:00", "23:59:59");
  261. }
  262. if (time.Contains("24:00"))
  263. {
  264. time = time.Replace("24:00", "23:59");
  265. }
  266. DateTime date = GetDateTime(time);
  267. return TimeInfo.Instance.Transition(date);
  268. }
  269. /// <summary>
  270. /// 根据时间戳获取当天指定时间(如传入当天7点的时间戳获取当天5点的时间戳)
  271. /// </summary>
  272. /// <param name="timeMilliSec">时间戳,单位毫秒</param>
  273. /// <returns></returns>
  274. public static long GetDayTimeBySec(long timeMilliSec, string time = "00:00:00")
  275. {
  276. DateTime date = TimeInfo.Instance.ToDateTime(timeMilliSec);
  277. string str = date.ToString("yyyy-MM-dd ") + time;
  278. DateTime date1 = DateTime.Parse(str);
  279. return TimeInfo.Instance.Transition(date1);
  280. }
  281. /// <summary>
  282. /// 获取明天指定时间的时间戳,返回毫秒
  283. /// </summary>
  284. /// <returns></returns>
  285. public static long GetTomorrowTime(string time = "00:00:00")
  286. {
  287. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  288. DateTime dt = current.AddDays(1);
  289. string str = dt.ToString("yyyy-MM-dd ") + time;
  290. DateTime date = DateTime.Parse(str);
  291. return TimeInfo.Instance.Transition(date);
  292. }
  293. /// <summary>
  294. /// 获取下月一号指定时间的时间戳,返回毫秒
  295. /// /// </summary>
  296. /// <returns></returns>
  297. public static long GetNextMonthTime(string time = "00:00:00")
  298. {
  299. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  300. DateTime date = DateTime.Parse(current.ToString("yyyy-MM-01 ")).AddMonths(1);
  301. string str = date.ToString("yyyy-MM-dd ") + time;
  302. date = DateTime.Parse(str);
  303. return TimeInfo.Instance.Transition(date);
  304. }
  305. /// <summary>
  306. /// 获取下周一指定时间的时间戳,返回毫秒
  307. /// /// </summary>
  308. /// <returns></returns>
  309. public static long GetNextWeekTime(string time = "00:00:00")
  310. {
  311. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  312. int week = Convert.ToInt32(current.DayOfWeek);
  313. week = week == 0 ? 7 : week;
  314. var start_time_next_week = current.AddDays(1 - week + 7).ToString("yyyy-MM-dd ") + time;
  315. DateTime date = DateTime.Parse(start_time_next_week);
  316. return TimeInfo.Instance.Transition(date);
  317. }
  318. /// <summary>
  319. /// 获取下周一指定时间的时间戳,返回毫秒
  320. /// /// </summary>
  321. /// <returns></returns>
  322. public static long GetNextWeekTime(int _week, string time = "00:00:00")
  323. {
  324. _week = _week == 0 ? 7 : _week;
  325. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  326. int _curweek = Convert.ToInt32(current.DayOfWeek);
  327. _curweek = _curweek == 0 ? 7 : _curweek;
  328. var end_time_last_week = current.AddDays(_week - _curweek + 7).ToString("yyyy-MM-dd ") + time;
  329. DateTime date = DateTime.Parse(end_time_last_week);
  330. return TimeInfo.Instance.Transition(date);
  331. }
  332. /// <summary>
  333. /// 获取本周某天指定时间时间戳,返回毫秒
  334. /// </summary>
  335. /// <returns></returns>
  336. public static long GetCurWeekTime(int _week, string time = "00:00:00")
  337. {
  338. _week = _week == 0 ? 7 : _week;
  339. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  340. int _curweek = Convert.ToInt32(current.DayOfWeek);
  341. _curweek = _curweek == 0 ? 7 : _curweek;
  342. var start_time_current_week = current.AddDays(_week - _curweek).ToString("yyyy-MM-dd ") + time;
  343. DateTime date = DateTime.Parse(start_time_current_week);
  344. return TimeInfo.Instance.Transition(date);
  345. }
  346. /// <summary>
  347. /// 获取上周某天指定时间时间戳,返回毫秒
  348. /// /// </summary>
  349. /// <returns></returns>
  350. public static long GetLastWeekTime(int _week, string time = "00:00:00")
  351. {
  352. _week = _week == 0 ? 7 : _week;
  353. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  354. int _curweek = Convert.ToInt32(current.DayOfWeek);
  355. _curweek = _curweek == 0 ? 7 : _curweek;
  356. var end_time_last_week = current.AddDays(_week - _curweek - 7).ToString("yyyy-MM-dd ") + time;
  357. DateTime date = DateTime.Parse(end_time_last_week);
  358. return TimeInfo.Instance.Transition(date);
  359. }
  360. /// <summary>
  361. /// 获取今天时间时间戳,返回毫秒
  362. /// </summary>
  363. /// <returns/>
  364. public static long GetCurDayTime(string time = "00:00:00")
  365. {
  366. var current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  367. var targetTimeStar = current.ToString("yyyy-MM-dd ") + time;
  368. var date = DateTime.Parse(targetTimeStar);
  369. return TimeInfo.Instance.Transition(date);
  370. }
  371. /// <summary>
  372. /// 获取下一个指定时间
  373. /// </summary>
  374. /// <param name="time"></param>
  375. public static long GetNextTime(string time = "00:00:00")
  376. {
  377. var curDayTime = GetCurDayTime(time);
  378. var curTime = TimeInfo.Instance.ServerNow();
  379. return curDayTime > curTime ? curDayTime : GetTomorrowTime(time);
  380. }
  381. private static readonly string[] Formats =
  382. {
  383. "HH:mm",
  384. "'['yyyy']['M']['dd']'",
  385. "'['yyyy']['MM']['d']'",
  386. "'['yyyy']['M']['d']'",
  387. "'['yyyy']['MM']['dd']'",
  388. "'['yyyy']['MM']['dd']['HH:mm']'",
  389. "'['yyyy']['MM']['dd']['H:mm']'",
  390. "'['yyyy']['M']['dd']['HH:mm']'",
  391. "'['yyyy']['M']['dd']['H:mm']'",
  392. "'['yyyy']['MM']['d']['HH:mm']'",
  393. "'['yyyy']['MM']['d']['H:mm']'",
  394. "'['yyyy']['M']['d']['HH:mm']'",
  395. "'['yyyy']['M']['d']['H:mm']'",
  396. "'['yyyy']['MM']['dd']['HH:mm:ss']'",
  397. "'['yyyy']['M']['dd']['HH:mm:ss']'",
  398. "'['yyyy']['MM']['d']['HH:mm:ss']'",
  399. "'['yyyy']['M']['d']['HH:mm:ss']'",
  400. };
  401. public static DateTime GetDateTime(string timeStr)
  402. {
  403. if (DateTime.TryParseExact(timeStr, Formats, null, DateTimeStyles.None, out var result))
  404. {
  405. return result;
  406. }
  407. throw new FormatException($"Invalid date format. timeStr:{timeStr}");
  408. }
  409. //转换成时间戳,单位毫秒
  410. public static long GetTimestamp(string timeStr)
  411. {
  412. var dateTime = GetDateTime(timeStr);
  413. return TimeInfo.Instance.Transition(dateTime);
  414. }
  415. //当前时间加N天
  416. public static long AddDays(int day)
  417. {
  418. return TimeInfo.Instance.ServerNow() + day * SECOND_PER_DAY * 1000;
  419. }
  420. /// <summary>
  421. /// 获取指定年月位周几, 周一为1 周日为7
  422. /// </summary>
  423. /// <param name="month"></param>
  424. /// <param name="day"></param>
  425. /// <returns>周几</returns>
  426. public static int GetWeekday(int month, int day)
  427. {
  428. TimeInfo.Instance.ServerNow();
  429. var date = new DateTime(DateTime.Now.Year, month, day);
  430. var weekdayNum = (int)date.DayOfWeek + 1;
  431. if (weekdayNum == 7)
  432. {
  433. weekdayNum = 1;
  434. }
  435. return weekdayNum;
  436. }
  437. /// <summary>
  438. /// 判断当前时间是否在时间段内
  439. /// </summary>
  440. public static bool IsInTime(string startTimeStr, string endTimeStr)
  441. {
  442. var startTime = GetDateTime(startTimeStr);
  443. var endTime = GetDateTime(endTimeStr);
  444. var dateTime = DateTime.Now;
  445. return dateTime >= startTime && dateTime < endTime;
  446. }
  447. /// <summary>
  448. /// 获取日清时间戳 格式 ['yyyy']['M']['dd'] ['yyyy']['MM']['d'] 等 会自动加到真实日清时间点 GameConst.DAILY_RESET_HOUR
  449. /// 返回到DateTime
  450. /// </summary>
  451. public static DateTime GetResetTime(string timeStr)
  452. {
  453. var time = GetDateTime(timeStr);
  454. var resetTime = new DateTime(time.Year, time.Month, time.Day, GameConst.DAILY_RESET_HOUR, 0, 0);
  455. return resetTime;
  456. }
  457. public static long GetResetTimeSec(string timeStr)
  458. {
  459. var dateTime = GetResetTime(timeStr);
  460. return TimeInfo.Instance.Transition(dateTime);
  461. }
  462. /// <summary>
  463. /// 当前时间是否在传入时间日清时间之后
  464. /// </summary>
  465. public static bool IsAfterResetTime(string timeStr)
  466. {
  467. var resetTime = GetResetTime(timeStr);
  468. return DateTime.Now > resetTime;
  469. }
  470. /// <summary>
  471. /// 获取当前时间属于那一年(1月1号5点前算上一年,5点后算今年)
  472. /// </summary>
  473. /// <returns></returns>
  474. public static int GetCurYear()
  475. {
  476. //这个是东8时区的0时间戳,然后去获取服务器时间
  477. DateTime unixStartTime = new DateTime(1970, 1, 1, 8, 0, 0);
  478. DateTime dateTime = unixStartTime.AddMilliseconds(TimeHelper.ServerNow());
  479. if (dateTime.Hour < 5 && dateTime.Month == 1 && dateTime.Day == 1)
  480. {
  481. return dateTime.Year - 1;
  482. }
  483. else
  484. {
  485. return dateTime.Year;
  486. }
  487. }
  488. /// <summary>
  489. /// 获取服务器 当前时间属于那个月(1号5点前算上个月,5点后算本月)
  490. /// </summary>
  491. /// <returns></returns>
  492. public static int GetCurMonth()
  493. {
  494. //这个是东8时区的0时间戳,然后去获取服务器时间
  495. DateTime unixStartTime = new DateTime(1970, 1, 1, 8, 0, 0);
  496. DateTime dateTime = unixStartTime.AddMilliseconds(TimeHelper.ServerNow());
  497. //if (TimeHelper.ServerNow() < TimeUtil.GetCurDayTime(GlobalCfgArray.globalCfg.refreshTime))
  498. if (dateTime.Hour < 5 && dateTime.Day == 1)
  499. {
  500. if (dateTime.Month == 1)
  501. {
  502. return 12;
  503. }
  504. else
  505. {
  506. return dateTime.Month - 1;
  507. }
  508. }
  509. else
  510. {
  511. return dateTime.Month;
  512. }
  513. }
  514. /// <summary>
  515. /// 获取当前时间是本月的那一天(5点前算上一天,5点后算当天)
  516. /// </summary>
  517. /// <returns></returns>
  518. public static int GetCurDay()
  519. {
  520. int _month = 0;
  521. //这个是东8时区的0时间戳,然后去获取服务器时间
  522. DateTime unixStartTime = new DateTime(1970, 1, 1, 8, 0, 0);
  523. DateTime dateTime = unixStartTime.AddMilliseconds(TimeHelper.ServerNow());
  524. //if (TimeHelper.ClientNow() < TimeUtil.GetCurDayTime(GlobalCfgArray.globalCfg.refreshTime))
  525. if (dateTime.Hour < 5)
  526. {
  527. if (dateTime.Day == 1)
  528. {
  529. if (dateTime.Month == 1)
  530. {
  531. _month = 12;
  532. }
  533. else
  534. {
  535. _month = dateTime.Month - 1;
  536. }
  537. return DateTime.DaysInMonth(dateTime.Year, _month);
  538. }
  539. else
  540. {
  541. return dateTime.Day - 1;
  542. }
  543. }
  544. else
  545. {
  546. return dateTime.Day;
  547. }
  548. }
  549. //检查两个时间区间是否有重合
  550. public static bool CheckTimeOverlap(long start1, long end1, long start2, long end2)
  551. {
  552. if (start1 >= start2 && start1 < end2) return true;
  553. if (end1 >= start2 && end1 < end2) return true;
  554. return start1 <= start2 && end1 >= end2;
  555. }
  556. //通过开始时间结束时间,算出是第几天, 单位毫秒
  557. public static int GetDayByTime(long startTime, long endTime)
  558. {
  559. var day = (endTime - startTime) / (SECOND_PER_DAY * 1000);
  560. return (int)day;
  561. }
  562. //通过开始时间结束时间,算出是第几天,每天5点是一天的开始时间 单位毫秒
  563. public static int GetDay5(long startTime)
  564. {
  565. var serverNow = TimeInfo.Instance.ServerNow();
  566. var startDay5Time = GetDay5Time(startTime);
  567. var nowDay5Time = GetDay5Time(serverNow);
  568. var day = (nowDay5Time - startDay5Time) / (SECOND_PER_DAY * 1000);
  569. //开始时间在5点之前,算一天
  570. if (startTime < startDay5Time) day++;
  571. //当前时间在5点之后,算一天
  572. if (serverNow > nowDay5Time) day++;
  573. return (int)day;
  574. }
  575. public static long GetDay5Time(long time)
  576. {
  577. var date = TimeInfo.Instance.ToDateTime(time);
  578. var todayFive = new DateTime(date.Year, date.Month, date.Day, 5, 0, 0);
  579. return TimeInfo.Instance.Transition(todayFive);
  580. }
  581. //从一组周几数据中,匹配拿到周几,往前匹配,可用来做开始时间
  582. public static int GetWeekDay(int[] days)
  583. {
  584. // 当前的“周几”数字,周日=0, 周一=1,..., 周六=6
  585. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  586. int today = (int)current.DayOfWeek;
  587. // 如果数组中包含今天,则返回今天
  588. if (Array.Exists(days, day => day == today))
  589. {
  590. return today;
  591. }
  592. // 查找最近的之前的“周几”
  593. for (int i = 1; i <= 7; i++)
  594. {
  595. int previousDay = (today - i + 7) % 7; // 加7和取模是为了保证值在0-6之间
  596. if (Array.Exists(days, day => day == previousDay))
  597. {
  598. return previousDay;
  599. }
  600. }
  601. // 如果没有找到,则返回数组中的第一个“周几”
  602. return days[0];
  603. }
  604. //从一组周几数据中,匹配拿到周几,往后匹配,可用来做结束时间
  605. public static int GetNextWeekDay(int[] days)
  606. {
  607. // 当前的“周几”数字,周日=0, 周一=1,..., 周六=6
  608. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  609. int today = (int)current.DayOfWeek;
  610. // 排序days数组以便查找
  611. Array.Sort(days);
  612. // 查找最近的下一个“周几”
  613. foreach (int day in days)
  614. {
  615. if (day > today)
  616. {
  617. return day;
  618. }
  619. }
  620. // 如果没有找到下一个“周几”,则返回数组中的第一个,表示下一周的那一天
  621. return days[0];
  622. }
  623. /// <summary>
  624. /// 从一组周几数据中,匹配拿到周几,往前匹配,可用来做开始时间
  625. /// </summary>
  626. /// <param name="days"></param>
  627. /// <returns></returns>
  628. public static DateTime GetWeekDayDateTime(int[] days)
  629. {
  630. // 获取当前的“周几”数字,周日=0, 周一=1, ..., 周六=6
  631. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  632. int today = (int)current.DayOfWeek;
  633. // 如果数组中包含今天,则返回今天的日期对象
  634. if (Array.Exists(days, day => day == today))
  635. {
  636. return current.Date; // 返回当天的日期
  637. }
  638. // 查找最近的之前的“周几”
  639. for (int i = 1; i <= 7; i++)
  640. {
  641. int previousDay = (today - i + 7) % 7; // 加7和取模是为了保证值在0-6之间
  642. if (Array.Exists(days, day => day == previousDay))
  643. {
  644. DateTime previousDateTime = current.AddDays(-i);
  645. return previousDateTime.Date; // 返回之前的日期
  646. }
  647. }
  648. // 如果没有找到,则返回本周第一个“周几”的日期
  649. DateTime firstDay = current.AddDays((days[0] - today + 7) % 7);
  650. return firstDay.Date;
  651. }
  652. /// <summary>
  653. /// 从一组周几数据中,匹配拿到周几,往后匹配,可用来做结束时间
  654. /// </summary>
  655. /// <param name="days"></param>
  656. /// <returns></returns>
  657. public static DateTime GetNextWeekDayDateTime(int[] days)
  658. {
  659. // 获取当前的“周几”数字,周日=0, 周一=1, ..., 周六=6
  660. DateTime current = TimeInfo.Instance.ToDateTime(TimeInfo.Instance.ServerNow());
  661. int today = (int)current.DayOfWeek;
  662. // 排序days数组以便查找
  663. Array.Sort(days);
  664. // 查找最近的下一个“周几”
  665. foreach (int day in days)
  666. {
  667. if (day > today)
  668. {
  669. DateTime nextDateTime = current.AddDays(day - today);
  670. return nextDateTime.Date; // 返回下一个工作日的日期
  671. }
  672. }
  673. // 如果没有找到下一个“周几”,返回本周的第一个工作日的日期
  674. DateTime firstDay = current.AddDays((days[0] + 7 - today) % 7);
  675. return firstDay.Date;
  676. }
  677. /// <summary>
  678. /// 获取今指定时间的时间戳,返回毫秒
  679. /// </summary>
  680. /// <returns/>
  681. public static long GetAppointedTime(DateTime dateTime, string time = "00:00:00")
  682. {
  683. var targetTimeStar = dateTime.ToString("yyyy-MM-dd ") + time;
  684. var date = DateTime.Parse(targetTimeStar);
  685. return TimeInfo.Instance.Transition(date);
  686. }
  687. /// <summary>
  688. /// 获取周几 N点的时间
  689. /// </summary>
  690. /// <param name="dayOfWeek">DayOfWeek.Wednesday</param>
  691. /// <param name="hour"></param>
  692. /// <returns></returns>
  693. public static long GetNextWednesdayAm(int dayOfWeek, int hour)
  694. {
  695. DateTime now = DateTime.UtcNow;
  696. DayOfWeek currentDayOfWeek = now.DayOfWeek;
  697. int daysUntilWednesday = (dayOfWeek - (int)currentDayOfWeek + 7) % 7;
  698. // 如果今天已经过了周三,就计算下周的
  699. if (daysUntilWednesday == 0 && now.Hour >= hour)
  700. {
  701. daysUntilWednesday = 7; // 下周的周三
  702. }
  703. DateTime nextWednesday = now.Date.AddDays(daysUntilWednesday).AddHours(hour);
  704. return TimeInfo.Instance.Transition(nextWednesday);
  705. }
  706. // 将 DateTime 转换为 Unix 时间戳
  707. public static long ConvertToUnixTimestamp(DateTime date)
  708. {
  709. DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
  710. TimeSpan timeSpan = date.ToUniversalTime() - unixEpoch;
  711. return (long)timeSpan.TotalSeconds;
  712. }
  713. }
  714. }