Files
tianrunCRM/Assets/CoolapeFrame/Scripts/toolkit/DateEx.cs
2020-07-04 14:41:25 +08:00

556 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
********************************************************************************
*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日后的86400000毫秒。同样的1969年12月31日是在1970年1月1日前86400000毫秒。Java的Date类使用long类型纪录这些毫秒值.因为long是有符号整数所以日期可以在1970年1月1日之前也可以在这之后。Long类型表示的最大正值和最大负值可以轻松的表示290000000年的时间这适合大多数人的时间要求。
* Java中可以用System.currentTimeMillis() 获取当前时间的long形式它的标示形式是从1970年1月1日起的到当前的毫秒的数。
* C# 日期型数据的长整型值是自 0001 年 1 月 1 日午夜 12:00,以来所经过时间以100 毫微秒为间隔表示时的数字。这个数在 C# 的 DateTime 中被称为Ticks(刻度)。DateTime 类型有一个名为 Ticks 的长整型只读属性,就保存着这个值。
* .NET下计算时间的方式不太一样它是计算单位是Ticks这里就需要做一个C#时间转换。关于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.
* 就是从公元元年元月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;
}
}
}