using System; namespace CoreAgent.ProtocolClient.Helpers { /// /// 时间戳工具类 /// 提供各种时间戳转换和处理的静态方法 /// public static class TimeStampHelper { /// /// 中国标准时间(北京时间,UTC+8) /// private static readonly TimeZoneInfo ChinaStandardTime = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); /// /// 将只有时分秒毫秒的时间戳转换为包含年月日的完整时间戳(按北京时间) /// /// 只有时分秒毫秒的时间戳(如:73365316) /// 包含年月日的完整Unix时间戳(毫秒) public static long ConvertToFullTimestamp(long timeOnlyTimestamp) { // 获取当前北京时间的日期部分 var utcNow = DateTime.UtcNow; var beijingNow = TimeZoneInfo.ConvertTime(utcNow, ChinaStandardTime); var beijingToday = beijingNow.Date; // 将毫秒时间戳转换为TimeSpan var timeSpan = TimeSpan.FromMilliseconds(timeOnlyTimestamp); // 组合成完整的北京时间 var fullDateTime = beijingToday.Add(timeSpan); // 转换为Unix时间戳(确保使用UTC时间) var utcDateTime = TimeZoneInfo.ConvertTimeToUtc(fullDateTime, ChinaStandardTime); return new DateTimeOffset(utcDateTime, TimeSpan.Zero).ToUnixTimeMilliseconds(); } /// /// 将Unix时间戳转换为北京时间 /// /// Unix时间戳(毫秒) /// 北京时间 public static DateTime ConvertToBeijingTime(long timestamp) { var utcDateTime = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime; return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, ChinaStandardTime); } /// /// 将Unix时间戳转换为UTC时间 /// /// Unix时间戳(毫秒) /// UTC时间 public static DateTime ConvertToUtcTime(long timestamp) { return DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime; } /// /// 获取时间戳的北京时间字符串表示 /// /// Unix时间戳(毫秒) /// 是否包含毫秒 /// 格式化的北京时间字符串 public static string GetBeijingTimeString(long timestamp, bool includeMilliseconds = true) { var beijingTime = ConvertToBeijingTime(timestamp); return includeMilliseconds ? beijingTime.ToString("yyyy-MM-dd HH:mm:ss.fff") : beijingTime.ToString("yyyy-MM-dd HH:mm:ss"); } /// /// 获取时间戳的UTC时间字符串表示 /// /// Unix时间戳(毫秒) /// 是否包含毫秒 /// 格式化的UTC时间字符串 public static string GetUtcTimeString(long timestamp, bool includeMilliseconds = true) { var utcTime = ConvertToUtcTime(timestamp); return includeMilliseconds ? utcTime.ToString("yyyy-MM-dd HH:mm:ss.fff") : utcTime.ToString("yyyy-MM-dd HH:mm:ss"); } /// /// 判断时间戳是否为毫秒级 /// /// 时间戳 /// true表示毫秒级,false表示秒级 public static bool IsMillisecondsTimestamp(long timestamp) { return timestamp > 9999999999; // 大于10位数字通常是毫秒级 } /// /// 智能转换时间戳(自动判断是秒级还是毫秒级) /// /// 时间戳 /// 北京时间 public static DateTime SmartConvertToBeijingTime(long timestamp) { if (IsMillisecondsTimestamp(timestamp)) { return ConvertToBeijingTime(timestamp); } else { // 秒级时间戳转换为毫秒级 var millisecondTimestamp = timestamp * 1000; return ConvertToBeijingTime(millisecondTimestamp); } } /// /// 智能转换时间戳(自动判断是秒级还是毫秒级) /// /// 时间戳 /// UTC时间 public static DateTime SmartConvertToUtcTime(long timestamp) { if (IsMillisecondsTimestamp(timestamp)) { return ConvertToUtcTime(timestamp); } else { // 秒级时间戳转换为毫秒级 var millisecondTimestamp = timestamp * 1000; return ConvertToUtcTime(millisecondTimestamp); } } /// /// 获取当前北京时间的Unix时间戳 /// /// 当前北京时间的Unix时间戳(毫秒) public static long GetCurrentBeijingTimestamp() { var beijingNow = TimeZoneInfo.ConvertTime(DateTime.UtcNow, ChinaStandardTime); return new DateTimeOffset(beijingNow, ChinaStandardTime.GetUtcOffset(beijingNow)).ToUnixTimeMilliseconds(); } /// /// 获取当前UTC时间的Unix时间戳 /// /// 当前UTC时间的Unix时间戳(毫秒) public static long GetCurrentUtcTimestamp() { return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); } /// /// 解析时间字符串为Unix时间戳 /// /// 时间字符串(格式:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd HH:mm:ss.fff) /// 是否为北京时间,true为北京时间,false为UTC时间 /// Unix时间戳(毫秒) public static long ParseDateTimeString(string dateTimeString, bool isBeijingTime = true) { if (DateTime.TryParse(dateTimeString, out DateTime parsedDateTime)) { if (isBeijingTime) { // 假设输入的是北京时间,转换为UTC var utcDateTime = TimeZoneInfo.ConvertTimeToUtc(parsedDateTime, ChinaStandardTime); return new DateTimeOffset(utcDateTime, TimeSpan.Zero).ToUnixTimeMilliseconds(); } else { // 假设输入的是UTC时间 return new DateTimeOffset(parsedDateTime, TimeSpan.Zero).ToUnixTimeMilliseconds(); } } throw new ArgumentException($"无法解析时间字符串: {dateTimeString}"); } /// /// 获取时间戳的详细信息 /// /// Unix时间戳(毫秒) /// 包含各种时间格式的详细信息 public static TimeStampInfo GetTimeStampInfo(long timestamp) { var beijingTime = ConvertToBeijingTime(timestamp); var utcTime = ConvertToUtcTime(timestamp); return new TimeStampInfo { OriginalTimestamp = timestamp, BeijingTime = beijingTime, UtcTime = utcTime, BeijingTimeString = beijingTime.ToString("yyyy-MM-dd HH:mm:ss.fff"), UtcTimeString = utcTime.ToString("yyyy-MM-dd HH:mm:ss.fff"), Year = beijingTime.Year, Month = beijingTime.Month, Day = beijingTime.Day, Hour = beijingTime.Hour, Minute = beijingTime.Minute, Second = beijingTime.Second, Millisecond = beijingTime.Millisecond }; } } /// /// 时间戳详细信息 /// public class TimeStampInfo { /// /// 原始时间戳 /// public long OriginalTimestamp { get; set; } /// /// 北京时间 /// public DateTime BeijingTime { get; set; } /// /// UTC时间 /// public DateTime UtcTime { get; set; } /// /// 北京时间字符串 /// public string BeijingTimeString { get; set; } = string.Empty; /// /// UTC时间字符串 /// public string UtcTimeString { get; set; } = string.Empty; /// /// 年 /// public int Year { get; set; } /// /// 月 /// public int Month { get; set; } /// /// 日 /// public int Day { get; set; } /// /// 时 /// public int Hour { get; set; } /// /// 分 /// public int Minute { get; set; } /// /// 秒 /// public int Second { get; set; } /// /// 毫秒 /// public int Millisecond { get; set; } } }