123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- 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);
- }
- }
- /// <summary>
- /// 用年份和第几周来获得一周开始和结束的时间,这里用星期一做开始。
- /// </summary>
- 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);
- }
- /// <summary> 求某年有多少周
- /// </summary>
- 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;
- }
- }
- /// <summary>
- /// 求当前日期是一年的中第几周
- /// </summary>
- 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;
- }
- /// <summary>
- /// 当前月有多少天
- /// </summary>
- 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);
- }
- /// <summary>
- /// 时间戳转为C#格式时间
- /// </summary>
- /// <param name="timeStamp">Unix时间戳格式</param>
- /// <returns>C#格式时间</returns>
- 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);
- }
- /// <summary>
- /// DateTime时间格式转换为Unix时间戳格式
- /// </summary>
- /// <param name="time"> DateTime时间格式</param>
- /// <returns>Unix时间戳格式</returns>
- public static int ConvertDateTimeInt(System.DateTime time)
- {
- System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
- return (int)(time - startTime).TotalSeconds;
- }
- /// <summary>
- /// 从标准服务器获取当前正确时间,如果获取失败,则获取本地时间,并存在startStandardTime
- /// </summary>
- /// <param name="timeZone">时区</param>
- /// <returns>DateTime时间格式</returns>
- 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;
- }
- /// <summary>
- /// 按照当前时间重新设置起始时间
- /// </summary>
- /// <param name="interval">设置可重置的时间差,单位为秒</param>
- 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);
- }
- }
- /// <summary>
- /// 设置暂停时的时间
- /// </summary>
- public static void SetPauseStandardTime()
- {
- pauseStandardTime = GetCurrenTimeByStandardTimeUseDateTime();
- }
- /// <summary>
- /// 从打开游戏到当前所经历的秒数
- /// </summary>
- /// <returns>单位为秒</returns>
- public static int GetRealTimeSinceStart()
- {
- return ConvertDateTimeInt(DateTime.Now) - ConvertDateTimeInt(localStandardTime);
- }
- /// <summary>
- /// 获取当前标准时间的时间戳
- /// </summary>
- /// <returns>返回时间戳</returns>
- public static int GetCurrentTimeByStandardTime()
- {
- return GetRealTimeSinceStart() + ConvertDateTimeInt(startStandardTime);
- }
- /// <summary>
- /// 获取当前标准时间
- /// </summary>
- /// <returns>返回DateTime时间格式</returns>
- public static DateTime GetCurrenTimeByStandardTimeUseDateTime()
- {
- return GetTime(GetCurrentTimeByStandardTime().ToString());
- }
- /// <summary>
- /// 设置当前标准时间
- /// </summary>
- /// <param name="dateTime"></param>
- public static void SetStandardTime(DateTime dateTime)
- {
- startStandardTime = dateTime;
- localStandardTime = DateTime.Now;
- }
- /// <summary>
- /// 获取当前标准时间
- /// </summary>
- public static DateTime GetStandardTimeExist()
- {
- return startStandardTime;
- //if (startStandardTime != null)
- // return startStandardTime;
- //else
- // return DateTime.Now;
- }
- public static int GetStandardTimeExistByTimeStamp()
- {
- return ConvertDateTimeInt(GetStandardTimeExist());
- }
- }
|