using System.Common; namespace System { /// /// 时间戳 /// public static class UnixTimestamp { static double ToTimestamp(this DateTime dt, UnixTimestampType unixTimestampType) { var timeDiff = new TimeSpan(dt.ToUniversalTime().Ticks - Constants.UnixEpochTicks); var total = unixTimestampType switch { UnixTimestampType.Milliseconds => timeDiff.TotalMilliseconds, UnixTimestampType.Seconds => timeDiff.TotalSeconds, _ => throw new ArgumentOutOfRangeException(nameof(unixTimestampType), unixTimestampType, null), }; return (double)Math.Floor(total); } /// /// 转换为Unix时间戳 /// /// /// public static long ToTimestamp(this DateTime dt) => (long)dt.ToTimestamp(UnixTimestampType.Milliseconds); /// /// 转换为Unix时间戳 /// /// /// public static int ToTimestampS(this DateTime dt) => (int)dt.ToTimestamp(UnixTimestampType.Seconds); static long GetTicks(long timestamp) { if (timestamp > Constants.TimestampMillisecondsMaxValue) timestamp = Constants.TimestampMillisecondsMaxValue; var ticks = Constants.UnixEpochTicks + TimeSpan.FromMilliseconds(timestamp).Ticks; return ticks; } static long GetTicks(int timestamp) { var ticks = Constants.UnixEpochTicks + TimeSpan.FromSeconds(timestamp).Ticks; return ticks; } static DateTime GetDateTime(long ticks, bool convertLocalTime = true) { var dt = new DateTime(ticks, DateTimeKind.Utc); return convertLocalTime ? dt.ToLocalTime() : dt; } static DateTimeOffset GetDateTimeOffset(long ticks, bool convertLocalTime = true) { var dt = new DateTimeOffset(ticks, TimeSpan.Zero); return convertLocalTime ? dt.ToLocalTime() : dt; } /// /// 将 Unix时间戳 转换为 /// /// /// /// public static DateTime ToDateTime(this long timestamp, bool convertLocalTime = true) { var ticks = GetTicks(timestamp); return GetDateTime(ticks, convertLocalTime); } /// /// 将 Unix时间戳 转换为 /// /// /// /// public static DateTime ToDateTime(this int timestamp, bool convertLocalTime = true) { var ticks = GetTicks(timestamp); return GetDateTime(ticks, convertLocalTime); } /// /// 将 Unix时间戳 转换为 /// /// /// /// public static DateTimeOffset ToDateTimeOffset(this long timestamp, bool convertLocalTime = true) { var ticks = GetTicks(timestamp); return GetDateTimeOffset(ticks, convertLocalTime); } /// /// 将 Unix时间戳 转换为 /// /// /// /// public static DateTimeOffset ToDateTimeOffset(this int timestamp, bool convertLocalTime = true) { var ticks = GetTicks(timestamp); return GetDateTimeOffset(ticks, convertLocalTime); } #if DEBUG [Obsolete("use ToTimestamp", true)] public static long CurrentMillis(this DateTime dateTime) => ToTimestamp(dateTime); #endif } }