Skip to content

Commit 0ce8e09

Browse files
committed
fix(Time): 修正时区处理确保时间戳计算正确
将 DateTime.Today 替换为 GetNow().Date 以使用配置的时区 为时间戳计算方法添加时区偏移处理,确保在不同时区下正确转换 更新相关方法的 XML 文档注释以反映时区使用变化
1 parent 73ef847 commit 0ce8e09

1 file changed

Lines changed: 48 additions & 14 deletions

File tree

GameFrameX.Foundation.Utility/Time/TimerHelper.Day.cs

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ public static bool IsUnixSameDay(long timestamp1, long timestamp2)
5757
/// <returns>今天零点时间</returns>
5858
/// <remarks>
5959
/// 此方法返回当天的零点时间(00:00:00)
60-
/// 使用DateTime.Today获取当前日期的零点时间
61-
/// 返回的是本地时区的时间
60+
/// 使用 <see cref="GetNow"/> 获取当前日期的零点时间
61+
/// 返回的是 <see cref="CurrentTimeZone"/> 时区的时间
6262
/// </remarks>
6363
public static DateTime GetTodayStartTime()
6464
{
65-
return DateTime.Today;
65+
return GetNow().Date;
6666
}
6767

6868
/// <summary>
@@ -71,12 +71,13 @@ public static DateTime GetTodayStartTime()
7171
/// <returns>今天零点时间戳(秒)</returns>
7272
/// <remarks>
7373
/// 此方法返回当天零点时间的Unix时间戳
74-
/// 先获取本地时区的今天零点时间,然后转换为时间戳
74+
/// 先获取 <see cref="CurrentTimeZone"/> 时区的今天零点时间,然后转换为时间戳
7575
/// 返回从1970-01-01 00:00:00 UTC开始的秒数
7676
/// </remarks>
7777
public static long GetTodayStartTimestamp()
7878
{
79-
return new DateTimeOffset(GetTodayStartTime()).ToUnixTimeSeconds();
79+
var date = GetTodayStartTime();
80+
return new DateTimeOffset(date, CurrentTimeZone.GetUtcOffset(date)).ToUnixTimeSeconds();
8081
}
8182

8283
/// <summary>
@@ -86,11 +87,11 @@ public static long GetTodayStartTimestamp()
8687
/// <remarks>
8788
/// 此方法返回当天的最后一秒(23:59:59)
8889
/// 通过获取明天零点时间然后减去1秒来计算
89-
/// 返回的是本地时区的时间
90+
/// 返回的是 <see cref="CurrentTimeZone"/> 时区的时间
9091
/// </remarks>
9192
public static DateTime GetTodayEndTime()
9293
{
93-
return DateTime.Today.AddDays(1).AddSeconds(-1);
94+
return GetTodayStartTime().AddDays(1).AddSeconds(-1);
9495
}
9596

9697
/// <summary>
@@ -99,12 +100,13 @@ public static DateTime GetTodayEndTime()
99100
/// <returns>今天23:59:59的时间戳(秒)</returns>
100101
/// <remarks>
101102
/// 此方法返回当天最后一秒的Unix时间戳
102-
/// 先获取本地时区的今天23:59:59,然后转换为时间戳
103+
/// 先获取 <see cref="CurrentTimeZone"/> 时区的今天23:59:59,然后转换为时间戳
103104
/// 返回从1970-01-01 00:00:00 UTC开始的秒数
104105
/// </remarks>
105106
public static long GetTodayEndTimestamp()
106107
{
107-
return new DateTimeOffset(GetTodayEndTime()).ToUnixTimeSeconds();
108+
var date = GetTodayEndTime();
109+
return new DateTimeOffset(date, CurrentTimeZone.GetUtcOffset(date)).ToUnixTimeSeconds();
108110
}
109111

110112

@@ -135,7 +137,22 @@ public static DateTime GetStartTimeOfDay(DateTime date)
135137
/// </remarks>
136138
public static long GetStartTimestampOfDay(DateTime date)
137139
{
138-
return new DateTimeOffset(GetStartTimeOfDay(date)).ToUnixTimeSeconds();
140+
var targetDate = GetStartTimeOfDay(date);
141+
TimeSpan offset;
142+
if (targetDate.Kind == DateTimeKind.Utc)
143+
{
144+
offset = TimeSpan.Zero;
145+
}
146+
else if (targetDate.Kind == DateTimeKind.Local)
147+
{
148+
offset = TimeZoneInfo.Local.GetUtcOffset(targetDate);
149+
}
150+
else
151+
{
152+
offset = CurrentTimeZone.GetUtcOffset(targetDate);
153+
}
154+
155+
return new DateTimeOffset(targetDate, offset).ToUnixTimeSeconds();
139156
}
140157

141158
/// <summary>
@@ -165,7 +182,22 @@ public static DateTime GetEndTimeOfDay(DateTime date)
165182
/// </remarks>
166183
public static long GetEndTimestampOfDay(DateTime date)
167184
{
168-
return new DateTimeOffset(GetEndTimeOfDay(date)).ToUnixTimeSeconds();
185+
var targetDate = GetEndTimeOfDay(date);
186+
TimeSpan offset;
187+
if (targetDate.Kind == DateTimeKind.Utc)
188+
{
189+
offset = TimeSpan.Zero;
190+
}
191+
else if (targetDate.Kind == DateTimeKind.Local)
192+
{
193+
offset = TimeZoneInfo.Local.GetUtcOffset(targetDate);
194+
}
195+
else
196+
{
197+
offset = CurrentTimeZone.GetUtcOffset(targetDate);
198+
}
199+
200+
return new DateTimeOffset(targetDate, offset).ToUnixTimeSeconds();
169201
}
170202

171203
/// <summary>
@@ -175,11 +207,11 @@ public static long GetEndTimestampOfDay(DateTime date)
175207
/// <remarks>
176208
/// 此方法返回明天的零点时间
177209
/// 例如:当前是2024-01-10,返回2024-01-11 00:00:00
178-
/// 使用本地时区计算时间
210+
/// 使用 <see cref="CurrentTimeZone"/> 时区计算时间
179211
/// </remarks>
180212
public static DateTime GetTomorrowStartTime()
181213
{
182-
return DateTime.Today.AddDays(1);
214+
return GetTodayStartTime().AddDays(1);
183215
}
184216

185217
/// <summary>
@@ -189,11 +221,13 @@ public static DateTime GetTomorrowStartTime()
189221
/// <remarks>
190222
/// 此方法返回明天零点时间的Unix时间戳
191223
/// 例如:当前是2024-01-10,返回2024-01-11 00:00:00的时间戳
224+
/// 使用 <see cref="CurrentTimeZone"/> 时区计算时间
192225
/// 会将时间转换为UTC时间后再计算时间戳
193226
/// </remarks>
194227
public static long GetTomorrowStartTimestamp()
195228
{
196-
return new DateTimeOffset(GetTomorrowStartTime()).ToUnixTimeSeconds();
229+
var date = GetTomorrowStartTime();
230+
return new DateTimeOffset(date, CurrentTimeZone.GetUtcOffset(date)).ToUnixTimeSeconds();
197231
}
198232

199233
/// <summary>

0 commit comments

Comments
 (0)