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