diff --git a/src/SJZY.Track.Application/Helpers/DateTimeHelper.cs b/src/SJZY.Track.Application/Helpers/DateTimeHelper.cs index c92202a4..c58fe83d 100644 --- a/src/SJZY.Track.Application/Helpers/DateTimeHelper.cs +++ b/src/SJZY.Track.Application/Helpers/DateTimeHelper.cs @@ -78,4 +78,24 @@ public static class DateTimeHelper var flag = timezone > 0f ? "+" : ""; return $"GMT {flag}{timeZoneStr.RemovePostFix(":00")}"; } + + /// + /// 转换为utc0时区的时间转化进行Compare + /// + public static int ConvertUtc0Compare(DateTime a, float aZone, DateTime b, float bZone) + { + if (Math.Abs(aZone - bZone) < 0.01f) + { + return a.CompareTo(b); + } + + if (Math.Abs(aZone - GlobalConst.NoneTrackTimeZone) < 0.01f) + aZone = 8.0f; + if (Math.Abs(bZone - GlobalConst.NoneTrackTimeZone) < 0.01f) + bZone = 8.0f; + + var aUtc = a.Subtract(TimeSpan.FromHours(aZone)); + var bUtc = b.Subtract(TimeSpan.FromHours(bZone)); + return aUtc.CompareTo(bUtc); + } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index e5b184cb..caebb3ee 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Http; using SJZY.Expand.AliyunOSS; using SJZY.Track.Application.Contract.Dtos.ProvideServices; +using SJZY.Track.Application.Helpers; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.TrackTemplate; @@ -201,12 +202,12 @@ public partial class TrackService case SortMethod.ByTrackTime: case SortMethod.ByTemplateAndTrackTime: // tips:quick-sort 直接修改原list - list.ForEach(item => item.TrackDetails.Sort((a, b) => a.Time.CompareTo(b.Time))); + list.ForEach(item => item.TrackDetails.Sort((a, b) => DateTimeHelper.ConvertUtc0Compare(a.Time, a.TimeZone ?? 8, b.Time, b.TimeZone ?? 8))); break; case null: case SortMethod.ByTrackTimeDesc: case SortMethod.ByTemplateAndTrackTimeDesc: - list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); + list.ForEach(item => item.TrackDetails.Sort((a, b) => DateTimeHelper.ConvertUtc0Compare(b.Time, b.TimeZone ?? 8, a.Time, a.TimeZone ?? 8))); break; default: throw new ArgumentOutOfRangeException(nameof(sortMethod), sortMethod, "不支持的排序方式");