using System; namespace Infrastructure.Helpers { /// /// 时间处理帮助类 /// 统一处理时区问题,确保所有时间都使用正确的时区 /// public static class TimeHelper { /// /// 获取当前中国标准时间(UTC+8) /// /// 当前中国标准时间 public static DateTime Now => GetChinaStandardTime(); /// /// 获取当前中国标准时间(UTC+8) /// /// 当前中国标准时间 public static DateTime GetChinaStandardTime() { // 获取UTC时间 var utcNow = DateTime.UtcNow; // 转换为中国标准时间(UTC+8) var chinaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); // 如果找不到中国时区,使用手动计算(UTC+8) if (chinaTimeZone == null) { return utcNow.AddHours(8); } return TimeZoneInfo.ConvertTimeFromUtc(utcNow, chinaTimeZone); } /// /// 将UTC时间转换为中国标准时间 /// /// UTC时间 /// 中国标准时间 public static DateTime ConvertUtcToChinaTime(DateTime utcTime) { if (utcTime.Kind != DateTimeKind.Utc) { utcTime = DateTime.SpecifyKind(utcTime, DateTimeKind.Utc); } var chinaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); if (chinaTimeZone == null) { return utcTime.AddHours(8); } return TimeZoneInfo.ConvertTimeFromUtc(utcTime, chinaTimeZone); } /// /// 将中国标准时间转换为UTC时间 /// /// 中国标准时间 /// UTC时间 public static DateTime ConvertChinaTimeToUtc(DateTime chinaTime) { var chinaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); if (chinaTimeZone == null) { return chinaTime.AddHours(-8); } return TimeZoneInfo.ConvertTimeToUtc(chinaTime, chinaTimeZone); } /// /// 获取当前时间的Unix时间戳(秒) /// /// Unix时间戳 public static long GetUnixTimestamp() { return ((DateTimeOffset)Now).ToUnixTimeSeconds(); } /// /// 获取当前时间的Unix时间戳(毫秒) /// /// Unix时间戳(毫秒) public static long GetUnixTimestampMilliseconds() { return ((DateTimeOffset)Now).ToUnixTimeMilliseconds(); } /// /// 将Unix时间戳转换为中国标准时间 /// /// Unix时间戳(秒) /// 中国标准时间 public static DateTime FromUnixTimestamp(long timestamp) { var utcTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime; return ConvertUtcToChinaTime(utcTime); } /// /// 将Unix时间戳(毫秒)转换为中国标准时间 /// /// Unix时间戳(毫秒) /// 中国标准时间 public static DateTime FromUnixTimestampMilliseconds(long timestamp) { var utcTime = DateTimeOffset.FromUnixTimeMilliseconds(timestamp).DateTime; return ConvertUtcToChinaTime(utcTime); } } }