102 lines
3.6 KiB
C#
102 lines
3.6 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Linq;
|
||
|
||
namespace JiShe.CollectBus.Common.Extensions
|
||
{
|
||
public static class DateTimeOffsetExtensions
|
||
{
|
||
|
||
/// <summary>
|
||
/// 获取当前时间毫秒级时间戳
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static long GetCurrentTimeMillis()
|
||
{
|
||
return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将Unix时间戳转换为日期时间
|
||
/// </summary>
|
||
/// <param name="millis"></param>
|
||
/// <returns></returns>
|
||
public static DateTime FromUnixMillis(long millis)
|
||
{
|
||
return DateTimeOffset.FromUnixTimeMilliseconds(millis).DateTime;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 采集时间节点计算
|
||
/// </summary>
|
||
/// <param name="referenceTime">待采集时间</param>
|
||
/// <param name="interval"></param>
|
||
/// <returns></returns>
|
||
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);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 将 DateTime 时间转换为 DateTimeOffset 时间
|
||
/// </summary>
|
||
/// <param name="rawDateTime"></param>
|
||
/// <returns></returns>
|
||
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;
|
||
|
||
/// <summary>
|
||
/// 获取当前 DateTimeOffset 距离 Unix 纪元(1970-01-01)的微秒数
|
||
/// </summary>
|
||
public static long ToUnixTimeMicroseconds(this DateTimeOffset dateTimeOffset)
|
||
{
|
||
// Ticks 单位是 100 纳秒,转换为微秒需除以 10
|
||
long elapsedTicks = dateTimeOffset.Ticks - UnixEpochTicks;
|
||
return elapsedTicks / 10; // 1 微秒 = 1000 纳秒 = 10 Ticks
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取当前 DateTimeOffset 距离 Unix 纪元(1970-01-01)的纳秒数
|
||
/// </summary>
|
||
public static long ToUnixTimeNanoseconds(this DateTimeOffset dateTimeOffset)
|
||
{
|
||
long nanoseconds = (dateTimeOffset.Ticks - UnixEpochTicks) * 100;
|
||
return nanoseconds;
|
||
}
|
||
}
|
||
}
|