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 = false) { var dt = new DateTime(ticks, DateTimeKind.Utc); return convertLocalTime ? dt.ToLocalTime() : dt; } static DateTimeOffset GetDateTimeOffset(long ticks, bool convertLocalTime = false) { var dt = new DateTimeOffset(ticks, TimeSpan.Zero); return convertLocalTime ? dt.ToLocalTime() : dt; } /// /// 将 Unix时间戳 转换为 /// /// /// /// public static DateTime ToDateTime(long timestamp, bool convertLocalTime = false) { var ticks = GetTicks(timestamp); return GetDateTime(ticks, convertLocalTime); } /// /// 将 Unix时间戳 转换为 /// /// /// /// public static DateTime ToDateTime(int timestamp, bool convertLocalTime = false) { var ticks = GetTicks(timestamp); return GetDateTime(ticks, convertLocalTime); } /// /// 将 Unix时间戳 转换为 /// /// /// /// public static DateTimeOffset ToDateTimeOffset(long timestamp, bool convertLocalTime = false) { var ticks = GetTicks(timestamp); return GetDateTimeOffset(ticks, convertLocalTime); } /// /// 将 Unix时间戳 转换为 /// /// /// /// public static DateTimeOffset ToDateTimeOffset(int timestamp, bool convertLocalTime = false) { var ticks = GetTicks(timestamp); return GetDateTimeOffset(ticks, convertLocalTime); } } }