暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

DateTimeUtil.cs 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace XCharts.Runtime
  5. {
  6. public static class DateTimeUtil
  7. {
  8. //private static readonly DateTime k_DateTime1970 = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1), TimeZoneInfo.Local);
  9. private static readonly DateTime k_DateTime1970 = new DateTime(1970, 1, 1);
  10. public static readonly int ONE_SECOND = 1;
  11. public static readonly int ONE_MINUTE = ONE_SECOND * 60;
  12. public static readonly int ONE_HOUR = ONE_MINUTE * 60;
  13. public static readonly int ONE_DAY = ONE_HOUR * 24;
  14. public static readonly int ONE_MONTH = ONE_DAY * 30;
  15. public static readonly int ONE_YEAR = ONE_DAY * 365;
  16. public static readonly int MIN_TIME_SPLIT_NUMBER = 4;
  17. private static string s_YearDateFormatter = "yyyy";
  18. //private static string s_MonthDateFormatter = "MM";
  19. //private static string s_DayDateFormatter = "dd";
  20. private static string s_HourDateFormatter = "HH:mm";
  21. private static string s_MinuteDateFormatter = "HH:mm";
  22. private static string s_SecondDateFormatter = "HH:mm:ss";
  23. //private static string s_DateFormatter = "yyyy-MM-dd HH:mm:ss";
  24. public static int GetTimestamp()
  25. {
  26. return (int) (DateTime.Now - k_DateTime1970).TotalSeconds;
  27. }
  28. public static int GetTimestamp(DateTime time)
  29. {
  30. return (int) (time - k_DateTime1970).TotalSeconds;
  31. }
  32. public static DateTime GetDateTime(int timestamp)
  33. {
  34. long span = ((long) timestamp) * 10000000;
  35. return k_DateTime1970.Add(new TimeSpan(span));
  36. }
  37. internal static string GetDateTimeFormatString(DateTime dateTime, double range)
  38. {
  39. var dateString = String.Empty;
  40. if (range >= DateTimeUtil.ONE_YEAR * DateTimeUtil.MIN_TIME_SPLIT_NUMBER)
  41. {
  42. dateString = dateTime.ToString(s_YearDateFormatter);
  43. }
  44. else if (range >= DateTimeUtil.ONE_MONTH * DateTimeUtil.MIN_TIME_SPLIT_NUMBER)
  45. {
  46. dateString = dateTime.Month == 1 ?
  47. dateTime.ToString(s_YearDateFormatter) :
  48. XCSettings.lang.GetMonthAbbr(dateTime.Month);
  49. }
  50. else if (range >= DateTimeUtil.ONE_DAY * DateTimeUtil.MIN_TIME_SPLIT_NUMBER)
  51. {
  52. dateString = dateTime.Day == 1 ?
  53. XCSettings.lang.GetMonthAbbr(dateTime.Month) :
  54. XCSettings.lang.GetDay(dateTime.Day);
  55. }
  56. else if (range >= DateTimeUtil.ONE_HOUR * DateTimeUtil.MIN_TIME_SPLIT_NUMBER)
  57. {
  58. dateString = dateTime.ToString(s_HourDateFormatter);
  59. }
  60. else if (range >= DateTimeUtil.ONE_MINUTE * DateTimeUtil.MIN_TIME_SPLIT_NUMBER)
  61. {
  62. dateString = dateTime.ToString(s_MinuteDateFormatter);
  63. }
  64. else
  65. {
  66. dateString = dateTime.ToString(s_SecondDateFormatter);
  67. }
  68. return dateString;
  69. }
  70. /// <summary>
  71. /// 根据给定的最大最小时间戳范围,计算合适的Tick值
  72. /// </summary>
  73. /// <param name="list"></param>
  74. /// <param name="minTimestamp"></param>
  75. /// <param name="maxTimestamp"></param>
  76. /// <param name="splitNumber"></param>
  77. internal static float UpdateTimeAxisDateTimeList(List<double> list, int minTimestamp, int maxTimestamp, int splitNumber)
  78. {
  79. list.Clear();
  80. var range = maxTimestamp - minTimestamp;
  81. if (range <= 0) return 0;
  82. if (splitNumber <= 0) splitNumber = 1;
  83. var dtMin = DateTimeUtil.GetDateTime(minTimestamp);
  84. var dtMax = DateTimeUtil.GetDateTime(maxTimestamp);
  85. int tick = 0;
  86. if (range >= ONE_YEAR * MIN_TIME_SPLIT_NUMBER)
  87. {
  88. var num = Math.Max(range / (splitNumber * ONE_YEAR), 1);
  89. var dtStart = new DateTime(dtMin.Year + 1, 1, 1);
  90. tick = num * 365 * 24 * 3600;
  91. while (dtStart.Ticks < dtMax.Ticks)
  92. {
  93. list.Add(DateTimeUtil.GetTimestamp(dtStart));
  94. dtStart = dtStart.AddYears(num);
  95. }
  96. }
  97. else if (range >= ONE_MONTH * MIN_TIME_SPLIT_NUMBER)
  98. {
  99. var num = Math.Max(range / (splitNumber * ONE_MONTH), 1);
  100. var dtStart = new DateTime(dtMin.Year, dtMin.Month, 1).AddMonths(1);
  101. tick = num * 30 * 24 * 3600;
  102. while (dtStart.Ticks < dtMax.Ticks)
  103. {
  104. list.Add(DateTimeUtil.GetTimestamp(dtStart));
  105. dtStart = dtStart.AddMonths(num);
  106. }
  107. }
  108. else if (range >= ONE_DAY * MIN_TIME_SPLIT_NUMBER)
  109. {
  110. tick = GetTickSecond(range, splitNumber, ONE_DAY);
  111. var startTimestamp = (minTimestamp - minTimestamp % tick) + tick;
  112. AddTickTimestamp(list, startTimestamp, maxTimestamp, tick);
  113. }
  114. else if (range >= ONE_HOUR * MIN_TIME_SPLIT_NUMBER)
  115. {
  116. tick = GetTickSecond(range, splitNumber, ONE_HOUR);
  117. var startTimestamp = (minTimestamp - minTimestamp % tick) + tick;
  118. AddTickTimestamp(list, startTimestamp, maxTimestamp, tick);
  119. }
  120. else if (range >= ONE_MINUTE * MIN_TIME_SPLIT_NUMBER)
  121. {
  122. tick = GetTickSecond(range, splitNumber, ONE_MINUTE);
  123. var startTimestamp = (minTimestamp - minTimestamp % tick) + tick;
  124. AddTickTimestamp(list, startTimestamp, maxTimestamp, tick);
  125. }
  126. else
  127. {
  128. tick = GetTickSecond(range, splitNumber, ONE_SECOND);
  129. var startTimestamp = (minTimestamp - minTimestamp % tick) + tick;
  130. AddTickTimestamp(list, startTimestamp, maxTimestamp, tick);
  131. }
  132. return tick;
  133. }
  134. private static int GetTickSecond(int range, int splitNumber, int tickSecond)
  135. {
  136. var num = 0;
  137. if (splitNumber > 0)
  138. {
  139. num = Math.Max(range / (splitNumber * tickSecond), 1);
  140. }
  141. else
  142. {
  143. num = 1;
  144. var tick = tickSecond;
  145. while (range / tick > 8)
  146. {
  147. num++;
  148. tick = num * tickSecond;
  149. }
  150. }
  151. return num * tickSecond;
  152. }
  153. private static void AddTickTimestamp(List<double> list, int startTimestamp, int maxTimestamp, int tickSecond)
  154. {
  155. while (startTimestamp <= maxTimestamp)
  156. {
  157. list.Add(startTimestamp);
  158. startTimestamp += tickSecond;
  159. }
  160. }
  161. }
  162. }