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