Browse Source
主要修复内容: 1. 修复变量名错误:MCC和MNC变量名与实际匹配内容对应 2. 增强空值检查:添加完整的参数验证和空值检查 3. 修复重复赋值:分别设置PLMN和IMSI属性 4. 优化正则表达式:添加RegexOptions.Compiled提高性能 5. 修复返回值检查:使用正确的StringToId返回值判断逻辑 6. 添加参数验证:验证Groups数量和参数有效性 7. 增强日志跟踪: - 添加ILogger支持,创建类型安全的Logger实例 - 记录BuildProtocolLog参数为空的情况 - 记录StringToId返回0(空字符串)的情况 - 记录正则匹配Groups数量不足的详细信息 - 使用私有Logger字段避免重复创建Logger实例 设计优势: - 逻辑正确性:修复了变量名错误和重复赋值问题 - 空值安全:添加了完整的空值检查和参数验证 - 性能优化:正则表达式使用编译选项提高性能 - 代码严谨性:添加了Groups数量验证和参数有效性检查 - 错误预防:使用空条件操作符避免空引用异常 - 调试友好:提供详细的错误日志记录便于问题排查 影响范围: - SIP协议解析的准确性 - 协议日志数据的完整性 - 代码的稳定性和可靠性 - 性能优化和错误预防 - 代码可读性和维护性 - 调试和问题排查能力显著提升feature/protocol-log-Perfect
6 changed files with 4336 additions and 4 deletions
@ -0,0 +1,274 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace CoreAgent.ProtocolClient.Helpers |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 时间戳工具类
|
||||
|
/// 提供各种时间戳转换和处理的静态方法
|
||||
|
/// </summary>
|
||||
|
public static class TimeStampHelper |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 中国标准时间(北京时间,UTC+8)
|
||||
|
/// </summary>
|
||||
|
private static readonly TimeZoneInfo ChinaStandardTime = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 将只有时分秒毫秒的时间戳转换为包含年月日的完整时间戳(按北京时间)
|
||||
|
/// </summary>
|
||||
|
/// <param name="timeOnlyTimestamp">只有时分秒毫秒的时间戳(如:73365316)</param>
|
||||
|
/// <returns>包含年月日的完整Unix时间戳(毫秒)</returns>
|
||||
|
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(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 将Unix时间戳转换为北京时间
|
||||
|
/// </summary>
|
||||
|
/// <param name="timestamp">Unix时间戳(毫秒)</param>
|
||||
|
/// <returns>北京时间</returns>
|
||||
|
public static DateTime ConvertToBeijingTime(long timestamp) |
||||
|
{ |
||||
|
var utcDateTime = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime; |
||||
|
return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, ChinaStandardTime); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 将Unix时间戳转换为UTC时间
|
||||
|
/// </summary>
|
||||
|
/// <param name="timestamp">Unix时间戳(毫秒)</param>
|
||||
|
/// <returns>UTC时间</returns>
|
||||
|
public static DateTime ConvertToUtcTime(long timestamp) |
||||
|
{ |
||||
|
return DateTimeOffset.FromUnixTimeMilliseconds(timestamp).UtcDateTime; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 获取时间戳的北京时间字符串表示
|
||||
|
/// </summary>
|
||||
|
/// <param name="timestamp">Unix时间戳(毫秒)</param>
|
||||
|
/// <param name="includeMilliseconds">是否包含毫秒</param>
|
||||
|
/// <returns>格式化的北京时间字符串</returns>
|
||||
|
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"); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 获取时间戳的UTC时间字符串表示
|
||||
|
/// </summary>
|
||||
|
/// <param name="timestamp">Unix时间戳(毫秒)</param>
|
||||
|
/// <param name="includeMilliseconds">是否包含毫秒</param>
|
||||
|
/// <returns>格式化的UTC时间字符串</returns>
|
||||
|
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"); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 判断时间戳是否为毫秒级
|
||||
|
/// </summary>
|
||||
|
/// <param name="timestamp">时间戳</param>
|
||||
|
/// <returns>true表示毫秒级,false表示秒级</returns>
|
||||
|
public static bool IsMillisecondsTimestamp(long timestamp) |
||||
|
{ |
||||
|
return timestamp > 9999999999; // 大于10位数字通常是毫秒级
|
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 智能转换时间戳(自动判断是秒级还是毫秒级)
|
||||
|
/// </summary>
|
||||
|
/// <param name="timestamp">时间戳</param>
|
||||
|
/// <returns>北京时间</returns>
|
||||
|
public static DateTime SmartConvertToBeijingTime(long timestamp) |
||||
|
{ |
||||
|
if (IsMillisecondsTimestamp(timestamp)) |
||||
|
{ |
||||
|
return ConvertToBeijingTime(timestamp); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// 秒级时间戳转换为毫秒级
|
||||
|
var millisecondTimestamp = timestamp * 1000; |
||||
|
return ConvertToBeijingTime(millisecondTimestamp); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 智能转换时间戳(自动判断是秒级还是毫秒级)
|
||||
|
/// </summary>
|
||||
|
/// <param name="timestamp">时间戳</param>
|
||||
|
/// <returns>UTC时间</returns>
|
||||
|
public static DateTime SmartConvertToUtcTime(long timestamp) |
||||
|
{ |
||||
|
if (IsMillisecondsTimestamp(timestamp)) |
||||
|
{ |
||||
|
return ConvertToUtcTime(timestamp); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// 秒级时间戳转换为毫秒级
|
||||
|
var millisecondTimestamp = timestamp * 1000; |
||||
|
return ConvertToUtcTime(millisecondTimestamp); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 获取当前北京时间的Unix时间戳
|
||||
|
/// </summary>
|
||||
|
/// <returns>当前北京时间的Unix时间戳(毫秒)</returns>
|
||||
|
public static long GetCurrentBeijingTimestamp() |
||||
|
{ |
||||
|
var beijingNow = TimeZoneInfo.ConvertTime(DateTime.UtcNow, ChinaStandardTime); |
||||
|
return new DateTimeOffset(beijingNow, ChinaStandardTime.GetUtcOffset(beijingNow)).ToUnixTimeMilliseconds(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 获取当前UTC时间的Unix时间戳
|
||||
|
/// </summary>
|
||||
|
/// <returns>当前UTC时间的Unix时间戳(毫秒)</returns>
|
||||
|
public static long GetCurrentUtcTimestamp() |
||||
|
{ |
||||
|
return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 解析时间字符串为Unix时间戳
|
||||
|
/// </summary>
|
||||
|
/// <param name="dateTimeString">时间字符串(格式:yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd HH:mm:ss.fff)</param>
|
||||
|
/// <param name="isBeijingTime">是否为北京时间,true为北京时间,false为UTC时间</param>
|
||||
|
/// <returns>Unix时间戳(毫秒)</returns>
|
||||
|
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}"); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 获取时间戳的详细信息
|
||||
|
/// </summary>
|
||||
|
/// <param name="timestamp">Unix时间戳(毫秒)</param>
|
||||
|
/// <returns>包含各种时间格式的详细信息</returns>
|
||||
|
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 |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 时间戳详细信息
|
||||
|
/// </summary>
|
||||
|
public class TimeStampInfo |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 原始时间戳
|
||||
|
/// </summary>
|
||||
|
public long OriginalTimestamp { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 北京时间
|
||||
|
/// </summary>
|
||||
|
public DateTime BeijingTime { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// UTC时间
|
||||
|
/// </summary>
|
||||
|
public DateTime UtcTime { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 北京时间字符串
|
||||
|
/// </summary>
|
||||
|
public string BeijingTimeString { get; set; } = string.Empty; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// UTC时间字符串
|
||||
|
/// </summary>
|
||||
|
public string UtcTimeString { get; set; } = string.Empty; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 年
|
||||
|
/// </summary>
|
||||
|
public int Year { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 月
|
||||
|
/// </summary>
|
||||
|
public int Month { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 日
|
||||
|
/// </summary>
|
||||
|
public int Day { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 时
|
||||
|
/// </summary>
|
||||
|
public int Hour { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 分
|
||||
|
/// </summary>
|
||||
|
public int Minute { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 秒
|
||||
|
/// </summary>
|
||||
|
public int Second { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 毫秒
|
||||
|
/// </summary>
|
||||
|
public int Millisecond { get; set; } |
||||
|
} |
||||
|
} |
File diff suppressed because it is too large
Loading…
Reference in new issue