using System; using System.Globalization; public class DateUtil { private static DateTime startStandardTime; private static DateTime pauseStandardTime = new DateTime(1970, 1, 1); private static DateTime localStandardTime; //如果12月31号与下一年的1月1好在同一个星期则算下一年的第一周 public static int GetWeekIndex(DateTime dTime) { try { //确定此时间在一年中的位置 var dayOfYear = dTime.DayOfYear; //当年第一天 var tempDate = new DateTime(dTime.Year, 1, 1); //确定当年第一天 var tempDayOfWeek = (int)tempDate.DayOfWeek; tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek; //确定星期几 var index = (int)dTime.DayOfWeek; index = index == 0 ? 7 : index; //当前周的范围 DateTime retStartDay = dTime.AddDays(-(index - 1)); DateTime retEndDay = dTime.AddDays(7 - index); //确定当前是第几周 var weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7); if (retStartDay.Year < retEndDay.Year) { weekIndex = 1; } return weekIndex; } catch (Exception ex) { throw new Exception(ex.Message); } } public static int GetWeekIndex(string strDate) { try { //需要判断的时间 DateTime dTime = Convert.ToDateTime(strDate); return GetWeekIndex(dTime); } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 用年份和第几周来获得一周开始和结束的时间,这里用星期一做开始。 /// public static void GetWeek(int year, int weekNum, out DateTime weekStart, out DateTime weekeEnd) { var dateTime = new DateTime(year, 1, 1); dateTime = dateTime.AddDays(7 * weekNum); weekStart = dateTime.AddDays(-(int)dateTime.DayOfWeek + (int)DayOfWeek.Monday); weekeEnd = dateTime.AddDays((int)DayOfWeek.Saturday - (int)dateTime.DayOfWeek + 1); } /// 求某年有多少周 /// public static int GetYearWeekCount(int year) { var dateTime = DateTime.Parse(year + "-01-01"); var firstDayOfWeek = Convert.ToInt32(dateTime.DayOfWeek);//得到该年的第一天是周几 if (firstDayOfWeek == 1) { var countDay = dateTime.AddYears(1).AddDays(-1).DayOfYear; var countWeek = countDay / 7 + 1; return countWeek; } else { var countDay = dateTime.AddYears(1).AddDays(-1).DayOfYear; var countWeek = countDay / 7 + 2; return countWeek; } } /// /// 求当前日期是一年的中第几周 /// public static int WeekOfYear(DateTime todayTime) { var firstdayofweek = Convert.ToInt32(Convert.ToDateTime(todayTime.Year.ToString(CultureInfo.InvariantCulture) + "- " + "1-1 ").DayOfWeek); var days = todayTime.DayOfYear; var daysOutOneWeek = days - (7 - firstdayofweek); if (daysOutOneWeek <= 0) { return 1; } var weeks = daysOutOneWeek / 7; if (daysOutOneWeek % 7 != 0) weeks++; return weeks + 1; } /// /// 当前月有多少天 /// public static int HowMonthDay(int year, int month) { int next_month; int next_year; if (month < 12) { next_month = month + 1; next_year = year; } else { next_month = 1; next_year = year + 1; } DateTime dt1 = Convert.ToDateTime(year + "-" + month + "-1"); DateTime dt2 = Convert.ToDateTime(next_year + "-" + next_month + "-1"); TimeSpan diff = dt2 - dt1; return diff.Days; } //get day in week by hashcode private static Array dayOfWeekArr = Enum.GetValues(typeof(DayOfWeek)); public static DayOfWeek GetDayOfWeekByHashCode(int code) { return (DayOfWeek)dayOfWeekArr.GetValue(code); } /// /// 时间戳转为C#格式时间 /// /// Unix时间戳格式 /// C#格式时间 public static DateTime GetTime(string timeStamp) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); long lTime = long.Parse(timeStamp + "0000000"); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); } public static DateTime GetTimeFromSeconds(string timeStamp) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); long lTime = long.Parse(timeStamp + "0000"); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); } public static DateTime GetTimeFromMiliseconds(string timeStamp) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); long lTime = long.Parse(timeStamp); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); } /// /// DateTime时间格式转换为Unix时间戳格式 /// /// DateTime时间格式 /// Unix时间戳格式 public static int ConvertDateTimeInt(System.DateTime time) { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); return (int)(time - startTime).TotalSeconds; } /// /// 从标准服务器获取当前正确时间,如果获取失败,则获取本地时间,并存在startStandardTime /// /// 时区 /// DateTime时间格式 public static DateTime GetStandardTime(int timeZone = 8) { DateTime dt; //返回国际标准时间 //只使用的时间服务器的IP地址,未使用域名 try { string[,] timeServer = new string[14, 2]; int[] searchOrder = new int[] { 3, 2, 4, 8, 9, 6, 11, 5, 10, 0, 1, 7, 12 }; timeServer[0, 0] = "time-a.nist.gov"; timeServer[0, 1] = "129.6.15.28"; timeServer[1, 0] = "time-b.nist.gov"; timeServer[1, 1] = "129.6.15.29"; timeServer[2, 0] = "time-a.timefreq.bldrdoc.gov"; timeServer[2, 1] = "132.163.4.101"; timeServer[3, 0] = "time-b.timefreq.bldrdoc.gov"; timeServer[3, 1] = "132.163.4.102"; timeServer[4, 0] = "time-c.timefreq.bldrdoc.gov"; timeServer[4, 1] = "132.163.4.103"; timeServer[5, 0] = "utcnist.colorado.edu"; timeServer[5, 1] = "128.138.140.44"; timeServer[6, 0] = "time.nist.gov"; timeServer[6, 1] = "192.43.244.18"; timeServer[7, 0] = "time-nw.nist.gov"; timeServer[7, 1] = "131.107.1.10"; timeServer[8, 0] = "nist1.symmetricom.com"; timeServer[8, 1] = "69.25.96.13"; timeServer[9, 0] = "nist1-dc.glassey.com"; timeServer[9, 1] = "216.200.93.8"; timeServer[10, 0] = "nist1-ny.glassey.com"; timeServer[10, 1] = "208.184.49.9"; timeServer[11, 0] = "nist1-sj.glassey.com"; timeServer[11, 1] = "207.126.98.204"; timeServer[12, 0] = "nist1.aol-ca.truetime.com"; timeServer[12, 1] = "207.200.81.113"; timeServer[13, 0] = "nist1.aol-va.truetime.com"; timeServer[13, 1] = "64.236.96.53"; int portNum = 13; string hostName; byte[] bytes = new byte[1024]; int bytesRead = 0; System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient(); for (int i = 0; i < 13; i++) { hostName = timeServer[searchOrder[i], 1]; try { client.Connect(hostName, portNum); System.Net.Sockets.NetworkStream ns = client.GetStream(); bytesRead = ns.Read(bytes, 0, bytes.Length); client.Close(); break; } catch (System.Exception) { } } char[] sp = new char[1]; sp[0] = ' '; dt = new DateTime(); string str1; str1 = System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRead); string[] s; s = str1.Split(sp); dt = DateTime.Parse(s[1] + " " + s[2]);//得到标准时间 dt = dt.AddHours(timeZone); } catch (Exception) { dt = DateTime.Parse("1970-1-1"); } if ((dt.ToString() != "1970-1-1 0:00:00")) startStandardTime = dt; else { Debuger.LogError("Can not get server time, use local instead!"); startStandardTime = DateTime.Now; } localStandardTime = DateTime.Now; //Debuger.LogWarning("[Server Standard Time]" + standardTime); return dt; } /// /// 按照当前时间重新设置起始时间 /// /// 设置可重置的时间差,单位为秒 public static void ResetStandardTime(int interval) { if(GetCurrentTimeByStandardTime() - ConvertDateTimeInt(pauseStandardTime) > interval && pauseStandardTime != new DateTime(1970, 1, 1)) { startStandardTime = GetCurrenTimeByStandardTimeUseDateTime(); pauseStandardTime = new DateTime(1970, 1, 1); } } /// /// 设置暂停时的时间 /// public static void SetPauseStandardTime() { pauseStandardTime = GetCurrenTimeByStandardTimeUseDateTime(); } /// /// 从打开游戏到当前所经历的秒数 /// /// 单位为秒 public static int GetRealTimeSinceStart() { return ConvertDateTimeInt(DateTime.Now) - ConvertDateTimeInt(localStandardTime); } /// /// 获取当前标准时间的时间戳 /// /// 返回时间戳 public static int GetCurrentTimeByStandardTime() { return GetRealTimeSinceStart() + ConvertDateTimeInt(startStandardTime); } /// /// 获取当前标准时间 /// /// 返回DateTime时间格式 public static DateTime GetCurrenTimeByStandardTimeUseDateTime() { return GetTime(GetCurrentTimeByStandardTime().ToString()); } /// /// 设置当前标准时间 /// /// public static void SetStandardTime(DateTime dateTime) { startStandardTime = dateTime; localStandardTime = DateTime.Now; } /// /// 获取当前标准时间 /// public static DateTime GetStandardTimeExist() { return startStandardTime; //if (startStandardTime != null) // return startStandardTime; //else // return DateTime.Now; } public static int GetStandardTimeExistByTimeStamp() { return ConvertDateTimeInt(GetStandardTimeExist()); } }