using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; namespace JiShe.CollectBus.Common.Extensions { public static class DateTimeOffsetExtensions { /// /// 获取当前时间毫秒级时间戳 /// /// public static long GetCurrentTimeMillis() { return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); } /// /// 将Unix时间戳转换为日期时间 /// /// /// public static DateTime FromUnixMillis(long millis) { return DateTimeOffset.FromUnixTimeMilliseconds(millis).DateTime; } /// /// 采集时间节点计算 /// /// 待采集时间 /// /// public static DateTime CalculateNextCollectionTime(this DateTime referenceTime, int interval) { // 计算精确到分钟的基准时间 var baseTime = new DateTime( referenceTime.Year, referenceTime.Month, referenceTime.Day, referenceTime.Hour, referenceTime.Minute, 0); // 计算总分钟数和下一个间隔点 int totalMinutes = baseTime.Hour * 60 + baseTime.Minute; int nextTotalMinutes = ((totalMinutes / interval) + 1) * interval; // 处理跨天情况 int daysToAdd = nextTotalMinutes / (24 * 60); int remainingMinutes = nextTotalMinutes % (24 * 60); int hours = remainingMinutes / 60; int minutes = remainingMinutes % 60; return baseTime.Date .AddDays(daysToAdd) .AddHours(hours) .AddMinutes(minutes); } /// /// 将 DateTime 时间转换为 DateTimeOffset 时间 /// /// /// public static DateTimeOffset GetDateTimeOffset(this DateTime rawDateTime) { //确保 Kind 为 Local(如果是 Unspecified) DateTime localDateTime = rawDateTime.Kind == DateTimeKind.Unspecified ? DateTime.SpecifyKind(rawDateTime, DateTimeKind.Local) : rawDateTime; // 转换为 DateTimeOffset(自动应用本地时区偏移) return new DateTimeOffset(localDateTime); } private static readonly long UnixEpochTicks = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero).Ticks; /// /// 获取当前 DateTimeOffset 距离 Unix 纪元(1970-01-01)的微秒数 /// public static long ToUnixTimeMicroseconds(this DateTimeOffset dateTimeOffset) { // Ticks 单位是 100 纳秒,转换为微秒需除以 10 long elapsedTicks = dateTimeOffset.Ticks - UnixEpochTicks; return elapsedTicks / 10; // 1 微秒 = 1000 纳秒 = 10 Ticks } /// /// 获取当前 DateTimeOffset 距离 Unix 纪元(1970-01-01)的纳秒数 /// public static long ToUnixTimeNanoseconds(this DateTimeOffset dateTimeOffset) { long nanoseconds = (dateTimeOffset.Ticks - UnixEpochTicks) * 100; return nanoseconds; } } }