Files
tianrunCRM/Assets/CoolapeFrame/Scripts/toolkit/DateEx.cs

556 lines
20 KiB
C#
Raw Normal View History

2020-07-04 14:41:25 +08:00
/*
********************************************************************************
*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日起的毫秒的数量表示日期19701211864000001969123119701186400000Java的Date类使用long类型纪录这些毫秒值.long是有符号整数197011Long类型表示的最大正值和最大负值可以轻松的表示290000000
* Java中可以用System.currentTimeMillis() long形式197011
* C# 0001 1 1 12:00,100 C# DateTime Ticks()DateTime Ticks
* .NET下计算时间的方式不太一样TicksC#Ticksmsdn上是这样说的
* 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.
* 1Java比较
* System.DateTime.UtcNow System.DateTime.Now 8Java与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;
}
}
}