using System;
using BetterGenshinImpact.GameTask;
namespace BetterGenshinImpact.Helpers;
///
/// 提供配置的服务器时区的当前时间
///
public interface IServerTimeProvider
{
///
/// 获取调整到服务器时区偏移量的当前时间
///
/// 表示当前服务器时间的
DateTimeOffset GetServerTimeNow();
///
/// 获取服务器时区偏移量
///
/// 表示服务器时区偏移量的
TimeSpan GetServerTimeOffset();
}
///
///
/// 此实现使用 获取当前UTC时间,
/// 然后应用配置的服务器时区偏移量
///
public class ServerTimeProvider : IServerTimeProvider
{
private readonly TimeProvider _timeProvider;
///
/// 初始化 类的新实例
///
/// 用于获取基准UTC时间的
public ServerTimeProvider(TimeProvider timeProvider)
{
_timeProvider = timeProvider;
}
///
public DateTimeOffset GetServerTimeNow()
{
var serverOffset = GetServerTimeOffset();
return _timeProvider.GetUtcNow().ToOffset(serverOffset);
}
public TimeSpan GetServerTimeOffset()
{
try
{
return TaskContext.Instance().Config.OtherConfig.ServerTimeZoneOffset;
}
// throw new Exception("Config未初始化"); in TaskContext.cs
catch (Exception)
{
// 如果配置未加载,假定为北京时间用于核心开发者测试
return TimeSpan.FromHours(8);
}
}
}
///
/// 提供静态外观以便轻松访问服务器时间
///
public static class ServerTimeHelper
{
private static IServerTimeProvider? _serverTimeProvider;
///
/// 使用具体的 实现初始化静态辅助类
/// 此方法必须在应用程序启动期间调用一次
///
/// 用于检索服务器时间的提供程序
/// 当 为 null 时抛出
public static void Initialize(IServerTimeProvider serverTimeProvider)
{
_serverTimeProvider = serverTimeProvider ?? throw new ArgumentNullException(nameof(serverTimeProvider));
}
///
/// 获取调整到服务器时区偏移量的当前时间
///
/// 表示当前服务器时间的
///
/// 如果尚未调用 则抛出
///
public static DateTimeOffset GetServerTimeNow()
{
if (_serverTimeProvider is null)
{
throw new InvalidOperationException(
$"{nameof(ServerTimeHelper)} 尚未初始化。请先调用 {nameof(Initialize)}。");
}
return _serverTimeProvider.GetServerTimeNow();
}
///
/// 获取服务器时区偏移量
///
/// 表示服务器时区偏移量的
///
/// 如果尚未调用 则抛出
///
public static TimeSpan GetServerTimeOffset()
{
if (_serverTimeProvider is null)
{
throw new InvalidOperationException(
$"{nameof(ServerTimeHelper)} 尚未初始化。请先调用 {nameof(Initialize)}。");
}
return _serverTimeProvider.GetServerTimeOffset();
}
}