From f97bc344d0ec39036227641b92f73e0683e2751f Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Fri, 10 Nov 2023 14:20:44 +0800 Subject: [PATCH] fix announcement time incorrectness --- .../Extension/DateTimeOffsetExtension.cs | 14 ---------- .../Extension/UnsafeDateTimeOffset.cs | 18 +++++++++++++ .../Model/InterChange/GachaLog/UIGF.cs | 4 ++- .../Hk4e/Common/Announcement/Announcement.cs | 2 ++ .../Announcement/AnnouncementWrapper.cs | 16 +++++++++++- .../Snap.Hutao/Web/Hoyolab/PlayerUid.cs | 16 ++++-------- .../Web/Hoyolab/ServerRegionTimeZone.cs | 26 +++++++++++++++++++ .../Web/Hoyolab/ServerTimeZoneInfo.cs | 26 ------------------- 8 files changed, 69 insertions(+), 53 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Extension/UnsafeDateTimeOffset.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/ServerRegionTimeZone.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/ServerTimeZoneInfo.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/DateTimeOffsetExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/DateTimeOffsetExtension.cs index 7c5ab181..867ef104 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/DateTimeOffsetExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/DateTimeOffsetExtension.cs @@ -42,18 +42,4 @@ internal static class DateTimeOffsetExtension return defaultValue; } } - - [SuppressMessage("", "SH002")] - public static unsafe DateTimeOffset UnsafeAdjustOffsetOnly(this DateTimeOffset dateTimeOffset, in TimeSpan offset) - { - UnsafeWritableDateTimeOffset* pUnsafe = (UnsafeWritableDateTimeOffset*)&dateTimeOffset; - pUnsafe->OffsetMinutes = (short)(offset.Ticks / TimeSpan.TicksPerMinute); - return dateTimeOffset; - } - - private struct UnsafeWritableDateTimeOffset - { - public DateTime DateTime; - public short OffsetMinutes; - } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/UnsafeDateTimeOffset.cs b/src/Snap.Hutao/Snap.Hutao/Extension/UnsafeDateTimeOffset.cs new file mode 100644 index 00000000..15e57cc4 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Extension/UnsafeDateTimeOffset.cs @@ -0,0 +1,18 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Extension; + +internal struct UnsafeDateTimeOffset +{ + private DateTime dateTime; + private short offsetMinutes; + + [SuppressMessage("", "SH002")] + public static unsafe DateTimeOffset AdjustOffsetOnly(DateTimeOffset dateTimeOffset, in TimeSpan offset) + { + UnsafeDateTimeOffset* pUnsafe = (UnsafeDateTimeOffset*)&dateTimeOffset; + pUnsafe->offsetMinutes = (short)(offset.Ticks / TimeSpan.TicksPerMinute); + return dateTimeOffset; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGF.cs b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGF.cs index 927930cf..a29b8471 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGF.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGF.cs @@ -34,6 +34,7 @@ internal sealed class UIGF : IJsonOnSerializing, IJsonOnDeserialized public void OnSerializing() { TimeSpan offset = GetRegionTimeZoneUtcOffset(); + foreach (UIGFItem item in List) { item.Time = item.Time.ToOffset(offset); @@ -44,9 +45,10 @@ internal sealed class UIGF : IJsonOnSerializing, IJsonOnDeserialized { // Adjust items timezone TimeSpan offset = GetRegionTimeZoneUtcOffset(); + foreach (UIGFItem item in List) { - item.Time = item.Time.UnsafeAdjustOffsetOnly(offset); + item.Time = UnsafeDateTimeOffset.AdjustOffsetOnly(item.Time, offset); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/Announcement.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/Announcement.cs index 68b20263..42947ed9 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/Announcement.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/Announcement.cs @@ -9,6 +9,7 @@ namespace Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; [HighQuality] internal sealed class Announcement : AnnouncementContent { + #region Binding /// /// 是否应展示时间 /// @@ -81,6 +82,7 @@ internal sealed class Announcement : AnnouncementContent { get => $"{StartTime:yyyy.MM.dd HH:mm} - {EndTime:yyyy.MM.dd HH:mm}"; } + #endregion /// /// 类型标签 diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementWrapper.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementWrapper.cs index e27a29da..ce675358 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementWrapper.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/AnnouncementWrapper.cs @@ -9,7 +9,7 @@ namespace Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; /// 公告包装器 /// [HighQuality] -internal sealed class AnnouncementWrapper : ListWrapper +internal sealed class AnnouncementWrapper : ListWrapper, IJsonOnDeserialized { /// /// 总数 @@ -46,4 +46,18 @@ internal sealed class AnnouncementWrapper : ListWrapper /// [JsonPropertyName("t")] public string TimeStamp { get; set; } = default!; + + public void OnDeserialized() + { + TimeSpan offset = new(TimeZone, 0, 0); + + foreach (AnnouncementListWrapper wrapper in List) + { + foreach (Announcement item in wrapper.List) + { + item.StartTime = UnsafeDateTimeOffset.AdjustOffsetOnly(item.StartTime, offset); + item.EndTime = UnsafeDateTimeOffset.AdjustOffsetOnly(item.EndTime, offset); + } + } + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/PlayerUid.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/PlayerUid.cs index aa632bf2..9dbe74ee 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/PlayerUid.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/PlayerUid.cs @@ -2,7 +2,6 @@ // Licensed under the MIT license. using System.Text.RegularExpressions; -using Windows.ApplicationModel.Store.Preview.InstallControl; namespace Snap.Hutao.Web.Hoyolab; @@ -62,7 +61,7 @@ internal readonly partial struct PlayerUid }; } - public static TimeZoneInfo GetTimeZoneInfo(string uid) + public static TimeSpan GetRegionTimeZoneUtcOffset(string uid) { // We make this a static method rather than property, // to avoid unnecessary memory allocation (Region field). @@ -73,17 +72,12 @@ internal readonly partial struct PlayerUid // 其他 UTC+08 return uid.AsSpan()[0] switch { - '6' => ServerTimeZoneInfo.AmericaTimeZone, - '7' => ServerTimeZoneInfo.EuropeTimeZone, - _ => ServerTimeZoneInfo.CommonTimeZone, + '6' => ServerRegionTimeZone.AmericaServerOffset, + '7' => ServerRegionTimeZone.EuropeServerOffset, + _ => ServerRegionTimeZone.CommonOffset, }; } - public static TimeSpan GetRegionTimeZoneUtcOffset(string uid) - { - return GetTimeZoneInfo(uid).BaseUtcOffset; - } - /// public override string ToString() { @@ -107,6 +101,6 @@ internal readonly partial struct PlayerUid }; } - [GeneratedRegex("[1-9][0-9]{8}")] + [GeneratedRegex("^[1-9][0-9]{8}$")] private static partial Regex UidRegex(); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/ServerRegionTimeZone.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/ServerRegionTimeZone.cs new file mode 100644 index 00000000..39bed842 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/ServerRegionTimeZone.cs @@ -0,0 +1,26 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Web.Hoyolab; + +internal static class ServerRegionTimeZone +{ + private static readonly TimeSpan AmericaOffsetValue = new(-05, 0, 0); + private static readonly TimeSpan EuropeOffsetValue = new(+01, 0, 0); + private static readonly TimeSpan CommonOffsetValue = new(+08, 0, 0); + + /// + /// UTC-05 + /// + public static TimeSpan AmericaServerOffset { get => AmericaOffsetValue; } + + /// + /// UTC+01 + /// + public static TimeSpan EuropeServerOffset { get => EuropeOffsetValue; } + + /// + /// UTC+08 + /// + public static TimeSpan CommonOffset { get => CommonOffsetValue; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/ServerTimeZoneInfo.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/ServerTimeZoneInfo.cs deleted file mode 100644 index f05d395c..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/ServerTimeZoneInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -namespace Snap.Hutao.Web.Hoyolab; - -internal static class ServerTimeZoneInfo -{ - private static readonly TimeZoneInfo AmericaTimeZoneValue = TimeZoneInfo.CreateCustomTimeZone("Server:UTC-05", new TimeSpan(-05, 0, 0), "UTC-05", "UTC-05"); - private static readonly TimeZoneInfo EuropeTimeZoneValue = TimeZoneInfo.CreateCustomTimeZone("Server:UTC+01", new TimeSpan(+01, 0, 0), "UTC+01", "UTC+01"); - private static readonly TimeZoneInfo CommonTimeZoneValue = TimeZoneInfo.CreateCustomTimeZone("Server:UTC+08", new TimeSpan(+08, 0, 0), "UTC+08", "UTC+08"); - - /// - /// UTC-05 - /// - public static TimeZoneInfo AmericaTimeZone { get => AmericaTimeZoneValue; } - - /// - /// UTC+01 - /// - public static TimeZoneInfo EuropeTimeZone { get => EuropeTimeZoneValue; } - - /// - /// UTC+08 - /// - public static TimeZoneInfo CommonTimeZone { get => CommonTimeZoneValue; } -} \ No newline at end of file