Skip to content

Commit 7e20133

Browse files
committed
feat(utility): 添加包含时区偏移的 Unix 时间戳方法
添加 UnixTimeSecondsWithTimeZone 和 UnixTimeMillisecondsWithTimeZone 方法,用于获取包含当前设置时区偏移量的 Unix 时间戳。这为需要基于本地时区计算时间戳的场景提供了便利。 同时添加了相应的单元测试,验证时区偏移量被正确包含在时间戳计算中。
1 parent 796f8af commit 7e20133

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

GameFrameX.Foundation.Tests/Utility/TimerHelperTimeZoneTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,5 +196,32 @@ public void SetTimeZone_WithInvalidId_ShouldDefaultToUtc()
196196
TimerHelper.SetTimeZone("InvalidTimeZoneId");
197197
Assert.Equal(TimeZoneInfo.Utc.Id, TimerHelper.CurrentTimeZone.Id);
198198
}
199+
200+
/// <summary>
201+
/// 测试 UnixTimeSecondsWithTimeZone 和 UnixTimeMillisecondsWithTimeZone 应包含时区偏移
202+
/// </summary>
203+
[Fact]
204+
public void UnixTimeWithTimeZone_ShouldIncludeOffset()
205+
{
206+
var offset = TimeSpan.FromHours(8);
207+
var customTimeZone = TimeZoneInfo.CreateCustomTimeZone("Test+8", offset, "Test+8", "Test+8");
208+
TimerHelper.SetTimeZone(customTimeZone);
209+
210+
var tsStandard = TimerHelper.UnixTimeSeconds();
211+
var tsWithZone = TimerHelper.UnixTimeSecondsWithTimeZone();
212+
var tsMsStandard = TimerHelper.UnixTimeMilliseconds();
213+
var tsMsWithZone = TimerHelper.UnixTimeMillisecondsWithTimeZone();
214+
215+
// 验证秒级时间戳差异接近 8 小时 (28800 秒)
216+
// 注意:由于执行时间差异,tsStandard 和 tsWithZone 获取的时间点可能略有不同,但差异不应很大
217+
var diffSeconds = tsWithZone - tsStandard;
218+
// 允许误差在 2 秒内
219+
Assert.True(Math.Abs(diffSeconds - 28800) <= 2, $"Expected diff 28800, but got {diffSeconds}");
220+
221+
// 验证毫秒级时间戳差异接近 8 小时 (28800000 毫秒)
222+
var diffMilliseconds = tsMsWithZone - tsMsStandard;
223+
// 允许误差在 100 毫秒内
224+
Assert.True(Math.Abs(diffMilliseconds - 28800000) <= 100, $"Expected diff 28800000, but got {diffMilliseconds}");
225+
}
199226
}
200227
}

GameFrameX.Foundation.Utility/Time/TimerHelper.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,42 @@ public static long UnixTimeMilliseconds()
143143
return new DateTimeOffset(GetUtcNow()).ToUnixTimeMilliseconds();
144144
}
145145

146+
/// <summary>
147+
/// 获取基于当前设置时区的 Unix 时间戳(秒级精度)。
148+
/// </summary>
149+
/// <returns>
150+
/// 返回一个 <see cref="long"/> 值,表示将当前设置时区的时间视为 UTC 时间时的 Unix 时间戳。
151+
/// 即:标准 Unix 时间戳 + 时区偏移秒数。
152+
/// </returns>
153+
/// <remarks>
154+
/// 此方法返回的时间戳包含时区偏移量。
155+
/// 例如:如果当前时区为 UTC+8,则返回的时间戳比标准 UTC 时间戳大 8 小时(28800秒)。
156+
/// </remarks>
157+
public static long UnixTimeSecondsWithTimeZone()
158+
{
159+
var utcNow = GetUtcNow();
160+
var offset = CurrentTimeZone.GetUtcOffset(utcNow);
161+
return new DateTimeOffset(utcNow).ToUnixTimeSeconds() + (long)offset.TotalSeconds;
162+
}
163+
164+
/// <summary>
165+
/// 获取基于当前设置时区的 Unix 时间戳(毫秒级精度)。
166+
/// </summary>
167+
/// <returns>
168+
/// 返回一个 <see cref="long"/> 值,表示将当前设置时区的时间视为 UTC 时间时的 Unix 时间戳。
169+
/// 即:标准 Unix 时间戳 + 时区偏移毫秒数。
170+
/// </returns>
171+
/// <remarks>
172+
/// 此方法返回的时间戳包含时区偏移量。
173+
/// 例如:如果当前时区为 UTC+8,则返回的时间戳比标准 UTC 时间戳大 8 小时(28800000毫秒)。
174+
/// </remarks>
175+
public static long UnixTimeMillisecondsWithTimeZone()
176+
{
177+
var utcNow = GetUtcNow();
178+
var offset = CurrentTimeZone.GetUtcOffset(utcNow);
179+
return new DateTimeOffset(utcNow).ToUnixTimeMilliseconds() + (long)offset.TotalMilliseconds;
180+
}
181+
146182
/// <summary>
147183
/// 获取指定时间距离纪元时间的毫秒数。
148184
/// </summary>

0 commit comments

Comments
 (0)