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