/* ******************************************************************************** *Copyright(C),coolae.net *Author: chenbin *Version: 2.0 *Date: 2017-01-09 *Description: 日期工具 *Others: *History: ********************************************************************************* */ using System.Collections; using System; using System.Text; using UnityEngine; /* * Java统计从1970年1月1日起的毫秒的数量表示日期。也就是说,例如,1970年1月2日,是在1月1日后的86,400,000毫秒。同样的,1969年12月31日是在1970年1月1日前86,400,000毫秒。Java的Date类使用long类型纪录这些毫秒值.因为long是有符号整数,所以日期可以在1970年1月1日之前,也可以在这之后。Long类型表示的最大正值和最大负值可以轻松的表示290,000,000年的时间,这适合大多数人的时间要求。 * Java中可以用System.currentTimeMillis() 获取当前时间的long形式,它的标示形式是从1970年1月1日起的到当前的毫秒的数。 * C# 日期型数据的长整型值是自 0001 年 1 月 1 日午夜 12:00,以来所经过时间以100 毫微秒为间隔表示时的数字。这个数在 C# 的 DateTime 中被称为Ticks(刻度)。DateTime 类型有一个名为 Ticks 的长整型只读属性,就保存着这个值。 * .NET下计算时间的方式不太一样,它是计算单位是Ticks,这里就需要做一个C#时间转换。关于Ticks,msdn上是这样说的: * A single tick represents one hundred nanoseconds or one ten-millionth of a second. The value of this property represents the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001. * 就是从公元元年元月1日午夜到指定时间的千万分之一秒了,为了和Java比较,说成万分之一毫秒。 * 需要注意的是这里是用的 System.DateTime.UtcNow 而不是 System.DateTime.Now ,因为我们在东八区,如果用后面那种形式就会发现时间会和想象当中的差了8个小时。Java与C#时间转换到这里就彻底实现了。 * 得到这些信息后,很容易写出将Java的长整型时间转化为C#时间。 long time_JAVA_Long = 1207969641193;//java长整型日期,毫秒为单位 DateTime dt_1970 = new DateTime(1970, 1, 1, 0, 0, 0); long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度 long time_tricks = tricks_1970 + time_JAVA_Long * 10000;//日志日期刻度 DateTime dt = new DateTime(time_tricks);//转化为DateTime */ namespace Coolape { public class DateEx { public const string fmt_yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss"; public const string fmt_yyyy_MM_dd_HH_mm_ss_fname = "yyyy_MM_dd_HH_mm_ss"; public const string fmt_MM_dd_HH_mm = "MM-dd HH:mm"; public const string fmt_yyyy_MM_dd = "yyyy-MM-dd"; public const string fmt_yyyyMMdd = "yyyyMMdd"; public const string fmt_yyyyMMddHHmm = "yyyyMMddHHmm"; public const string fmt_HH_mm_ss = "HH:mm:ss"; public const long TIME_MILLISECOND = 1; public const long TIME_SECOND = 1000 * TIME_MILLISECOND; public const long TIME_MINUTE = 60 * TIME_SECOND; public const long TIME_HOUR = 60 * TIME_MINUTE; public const long TIME_DAY = 24 * TIME_HOUR; public const long TIME_WEEK = 7 * TIME_DAY; public const long TIME_YEAR = 365 * TIME_DAY; public static bool isFinishInit = false; public static long begainTimeMs = 0; public static float offsetSeconds = 0; static DateTime dat0 = new DateTime(1970, 1, 1); public static void init(long serverTimeMs = 0) { if (serverTimeMs == 0) { begainTimeMs = toJavaDate(DateTime.UtcNow); } else { begainTimeMs = serverTimeMs; } offsetSeconds = Time.realtimeSinceStartup; isFinishInit = true; } public static long now { get { if (!isFinishInit) init(); // return DateTime.Now.ToFileTime (); return nowMS * 10000; } } public static long nowMS { get { if (!isFinishInit) init(); // return DateTime.Now.ToFileTime () / 10000; return begainTimeMs + (long)((Time.realtimeSinceStartup - offsetSeconds) * 1000); } } public static string format(string fmt) { // return format (DateTime.Now, fmt); return formatByMs(nowMS, fmt); } public static string nowString() { return format(fmt_yyyy_MM_dd_HH_mm_ss); } public static string format(DateTime d, string fmt) { return d.ToString(fmt); } public static string formatByMs(long ms, string fmt = fmt_yyyy_MM_dd_HH_mm_ss) { long us = ms * 10000 + dat0.Ticks; DateTime d = new DateTime(us); return d.ToLocalTime().ToString(fmt); } public static DateTime javaDate(long ms) { long tm = ms * 10000 + dat0.Ticks; return new DateTime(tm); } // 取得客户端当前时间 static public long toJavaNTimeLong() { return toJavaDate(DateTime.UtcNow); } public static long toJavaDate(DateTime dat) { DateTime d2 = dat.ToUniversalTime(); TimeSpan ts = new TimeSpan(d2.Ticks - dat0.Ticks); return (long)ts.TotalMilliseconds; /*long v = (dat.Ticks - dat0.Ticks) / 10000; return v;*/ } //服务器同步时间diffCSTime:表示客服端与服务器端的时间差,isCellMS:表示到秒,毫秒往上收了一秒 public static long newDateLong(long diffCSTime = 0, bool isCellMS = false) { long time = diffCSTime + toJavaNTimeLong(); if (isCellMS) { double tmT = time / (double)TIME_SECOND; tmT = System.Math.Ceiling(tmT); time = (long)tmT * TIME_SECOND; } return time; } public static long diffTimeWithServer = 0; public static long nowServerTime { get { // return diffTimeWithServer + toJavaNTimeLong (); return nowMS; } } // [0]=天,[1]=时,[2]=分,[3]=秒,[4]=毫秒 static public int[] getTimeArray(long ms) { long tmpMs = ms; int ss = 1000; int mi = ss * 60; int hh = mi * 60; int dd = hh * 24; int day = 0, hour = 0, minute = 0, second = 0, milliSecond = 0; if (tmpMs > dd) { day = (int)(tmpMs / dd); tmpMs %= dd; } if (tmpMs > hh) { hour = (int)(tmpMs / hh); tmpMs %= hh; } if (tmpMs > mi) { minute = (int)(tmpMs / mi); tmpMs %= mi; } if (tmpMs > ss) { second = (int)(tmpMs / ss); tmpMs %= ss; } milliSecond = (int)tmpMs; return new int[] { day, hour, minute, second, milliSecond }; } public static string toHHMMSS(long ms) { int[] ss = getTimeArray(ms); return PStr.b().a(ss[1]).a(":").a(ss[2]).a(":").a(ss[3]).e(); } public static string toHHMMSS2(long ms) { int[] ss = getTimeArray(ms); return PStr.b().a(ss[1]).a(Localization.Get("UIHour")).a(ss[2]).a(Localization.Get("UIMinute")).a(ss[3]).a(Localization.Get("UISecond")).e(); } // 时间格式化为:HH:mm:ss; public static string toStrEn(long ms) { int[] arr = getTimeArray(ms); int hour = arr[0] * 24 + arr[1]; String strHour = ""; String strMinute = ""; String strSecond = ""; if (hour > 0) { strHour = hour < 10 ? PStr.b().a("0").a(hour).e() : PStr.b().a("").a(hour).e(); strHour = PStr.b().a(strHour).a(":").e(); } int minute = arr[2]; if (minute >= 0) { strMinute = minute < 10 ? PStr.b().a("0").a(minute).e() : PStr.b().a(minute).a("").e(); strMinute = PStr.b().a(strMinute).a(":").e(); } int second = arr[3]; if (second >= 0) { strSecond = second < 10 ? PStr.b().a("0").a(second).e() : PStr.b().a(second).a("").e(); } return PStr.b().a(strHour).a(strMinute).a(strSecond).e(); } // 时间格式化为:HH时mm分ss秒; public static string toStrCn(long ms) { int[] arr = getTimeArray(ms); int hour = arr[0] * 24 + arr[1]; String strHour = ""; String strMinute = ""; String strSecond = ""; if (hour > 0) { strHour = hour < 10 ? PStr.b().a("0").a(hour).e() : PStr.b().a(hour).a("").e(); strHour = PStr.b().a(strHour).a(Localization.Get("UIHour")).e(); } int minute = arr[2]; if (minute > 0) { strMinute = minute < 10 ? PStr.b().a("0").a(minute).e() : PStr.b().a(minute).a("").e(); strMinute = PStr.b().a(strMinute).a(Localization.Get("UIMinute")).e(); } int second = arr[3]; if (second >= 0) { strSecond = second < 10 ? PStr.b().a("0").a(second).e() : PStr.b().a(second).a("").e(); strSecond = PStr.b().a(strSecond).a(Localization.Get("UISecond")).e(); } return PStr.b().a(strHour).a(strMinute).a(strSecond).e(); } public static string ToTimeStr2(long msec) { // 将毫秒数换算成x天x时x分x秒x毫秒 int day = 0, hour = 0, minute = 0, second = 0; string retstr = ""; long remainder; day = (int)(msec / 86400000); retstr = (day == 0) ? "" : PStr.b().a(day).a(Localization.Get("UIDay")).e(); remainder = msec % 86400000; if (remainder != 0) { hour = (int)remainder / 3600000; } // hour += day * 24; // retstr += ((retstr.Length > 0 || hour > 0) ? (hour < 10 ? "0" + hour + Localization.Get("UIHour") : hour + Localization.Get("UIHour")) : ""); string hstr = ((retstr.Length > 0 || hour > 0) ? PStr.b().a(hour).a(Localization.Get("UIHour")).e() : ""); retstr = PStr.b().a(retstr).a(hstr).e(); remainder = remainder % 3600000; if (remainder != 0) { minute = (int)remainder / 60000; } // retstr += ((retstr.Length > 0 || minute > 0) ? (minute < 10 ? "0" + minute + Localization.Get("UIMinute") : minute + Localization.Get("UIMinute")) : "00" + Localization.Get("UIMinute")); string mstr = ((retstr.Length > 0 || minute > 0) ? PStr.b().a(minute).a(Localization.Get("UIMinute")).e() : ""); retstr = PStr.b().a(retstr).a(mstr).e(); second = (int)remainder % 60000; second = second / 1000; retstr = PStr.b().a(retstr).a(second).a(Localization.Get("UISecond")).e(); return retstr; } public static string ToTimeStr3(long msec) { // 将毫秒数换算成x天x时 int day = 0, hour = 0, minute = 0, second = 0; string retstr = ""; long remainder; day = (int)(msec / 86400000); retstr = (day == 0) ? "" : PStr.b().a(day).a(Localization.Get("UIDay")).e(); remainder = msec % 86400000; if (remainder != 0) { hour = (int)remainder / 3600000; } string hstr = ((retstr.Length > 0 || hour > 0) ? PStr.b().a(hour).a(Localization.Get("UIHour")).e() : ""); return PStr.b().a(retstr).a(hstr).e(); } public static string ToTimeCost(long msec) { int day = 0, hour = 0, minute = 0, second = 0; string retstr = ""; long remainder; day = (int)(msec / 86400000); retstr = (day == 0) ? "" : PStr.b().a(day).a(Localization.Get("DayBefore")).e(); if (!string.IsNullOrEmpty(retstr)) { return retstr; } remainder = msec % 86400000; if (remainder != 0) { hour = (int)remainder / 3600000; } // hour += day * 24; string hstr = ((retstr.Length > 0 || hour > 0) ? PStr.b().a(hour).a(Localization.Get("HourBefore")).e() : ""); retstr = PStr.b().a(retstr).a(hstr).e(); if (!string.IsNullOrEmpty(retstr)) { return retstr; } remainder = remainder % 3600000; if (remainder != 0) { minute = (int)remainder / 60000; } // retstr += ((retstr.Length > 0 || minute > 0) ? (minute + Localization.Get("MinutesBefore")) : "0" + Localization.Get("MinutesBefore")); string mstr = ((retstr.Length > 0 || minute > 0) ? PStr.b().a(minute).a(Localization.Get("MinutesBefore")).e() : ""); retstr = PStr.b().a(retstr).a(mstr).e(); if (!string.IsNullOrEmpty(retstr)) { return retstr; } second = (int)remainder % 60000; second = second / 1000; // retstr += (second < 10 ? "0" + second + Localization.Get("SecondBefore") : second + Localization.Get("SecondBefore")); retstr = PStr.b().a(retstr).a(second).a(Localization.Get("SecondBefore")).e(); return retstr; } public static string ToTimeStr(long msec) { // 将毫秒数换算成x天x时x分x秒x毫秒 int day = 0, hour = 0, minute = 0, second = 0; string retstr = ""; long remainder; day = (int)(msec / 86400000); retstr = (day == 0) ? "" : PStr.b().a(day).a(":").e(); remainder = msec % 86400000; if (remainder != 0) { hour = (int)remainder / 3600000; } hour += day * 24; string hstr = ((retstr.Length > 0 || hour > 0) ? (hour < 10 ? PStr.b().a("0").a(hour).a(":").e() : PStr.b().a(hour).a(":").e()) : ""); retstr = PStr.b().a(retstr).a(hstr).e(); remainder = remainder % 3600000; if (remainder != 0) { minute = (int)remainder / 60000; } string mstr = ((retstr.Length > 0 || minute > 0) ? (minute < 10 ? PStr.b().a("0").a(minute).a(":").e() : PStr.b().a(minute, ":").e()) : "00:"); retstr = PStr.b().a(retstr).a(mstr).e(); second = (int)remainder % 60000; second = second / 1000; string sstr = (second < 10 ? PStr.b().a("0", second).e() : PStr.b().a(second, "").e()); retstr = PStr.b().a(retstr).a(sstr).e(); return retstr; } static public long getLongJavaByHMS(string hms) { hms = hms.Replace("\\\\", ""); string yyMMddHHmmss = format(fmt_yyyy_MM_dd) + " " + hms; return getLongJavaByYMDHMS(yyMMddHHmmss); } static public string nowStrYyyyMMdd() { return format(fmt_yyyyMMdd); } static public string nxtStrYyyyMMdd() { DateTime dt = DateTime.Now; DateTime nxtDt = dt.AddDays(1); return format(nxtDt, fmt_yyyyMMdd); } static public bool isSameDateStr(String dateStr) { if (string.IsNullOrEmpty(dateStr)) return false; string nowStr = nowStrYyyyMMdd(); int v = nowStr.CompareTo(dateStr); bool flag = v > -1; return flag; } static public string nowStrYyyyMMddHHmm() { return format(fmt_yyyyMMddHHmm); } static public string nxtStrYyyyMMddHHmm() { DateTime dt = DateTime.Now; DateTime nxtDt = dt.AddMinutes(1); return format(nxtDt, fmt_yyyyMMddHHmm); } static public bool isBeforeNow4yyMMddHHmm(String dateStr) { if (string.IsNullOrEmpty(dateStr)) return false; string nowStr = nowStrYyyyMMddHHmm(); int v = nowStr.CompareTo(dateStr); bool flag = v > -1; return flag; } static public long getLongJavaByYMDHMS(string yyMMddHHmmss) { try { yyMMddHHmmss = yyMMddHHmmss.Replace("\\\\", ""); DateTime dt = DateTime.Parse(yyMMddHHmmss); long jl = toJavaDate(dt); // return jl + diffTimeWithServer; return jl; } catch (Exception) { return 0; } } // public static int getWeek(int year, int month, int day) { DateTime dt = new DateTime(year, month, day); string weekstr = dt.DayOfWeek.ToString(); int w = 0; switch (weekstr) { case "Monday": // weekstr = "星期一"; w = 1; break; case "Tuesday": // weekstr = "星期二"; w = 2; break; case "Wednesday": // weekstr = "星期三"; w = 3; break; case "Thursday": // weekstr = "星期四"; w = 4; break; case "Friday": // weekstr = "星期五"; w = 5; break; case "Saturday": // weekstr = "星期六"; w = 6; break; case "Sunday": // weekstr = "星期日"; w = 0; break; } return w; } // 取得某年某月有几天 public static int getMothDays(int year, int month) { int Result = 30; if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { Result = 31; } else if (month == 2) { if (isLeapYear(year)) { Result = 29; } else { Result = 28; } } return Result; } // 是否闰年 public static bool isLeapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { return true; } return false; } } }