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());
}
}