using System; using System.Collections.ObjectModel; namespace LanMontainDesktop.Services; /// /// 时区服务,提供时区信息和时间转换功能 /// public sealed class TimeZoneService { private TimeZoneInfo _currentTimeZone = TimeZoneInfo.Local; /// /// 当前选中的时区 /// public TimeZoneInfo CurrentTimeZone { get => _currentTimeZone; set { if (_currentTimeZone != value) { _currentTimeZone = value; TimeZoneChanged?.Invoke(this, EventArgs.Empty); } } } /// /// 时区变更事件 /// public event EventHandler? TimeZoneChanged; /// /// 获取所有可用的时区 /// public ReadOnlyCollection GetAllTimeZones() { return TimeZoneInfo.GetSystemTimeZones(); } /// /// 获取当前时区的当前时间 /// public DateTime GetCurrentTime() { return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, _currentTimeZone); } /// /// 根据时区ID设置当前时区 /// public bool SetTimeZoneById(string timeZoneId) { try { var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); CurrentTimeZone = timeZone; return true; } catch (Exception) { return false; } } /// /// 获取时区显示名称(包含UTC偏移) /// public string GetTimeZoneDisplayName(TimeZoneInfo timeZone) { var offset = timeZone.GetUtcOffset(DateTime.UtcNow); var sign = offset >= TimeSpan.Zero ? "+" : "-"; var hours = Math.Abs(offset.Hours); var minutes = Math.Abs(offset.Minutes); return $"(UTC{sign}{hours:D2}:{minutes:D2}) {timeZone.DisplayName}"; } /// /// 获取常用时区列表 /// public TimeZoneInfo[] GetCommonTimeZones() { return new[] { TimeZoneInfo.Local, // 本地时区 TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"), // 北京时间 TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"), // 东京时间 TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"), // 太平洋时间 TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"), // 东部时间 TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"), // 中欧时间 TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"), // 伦敦时间 TimeZoneInfo.FindSystemTimeZoneById("UTC"), // 协调世界时 }; } }