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; }
}
}