如何将所有DateTime属性转换为集合中的不同时区



我有一个具有用户的站点,我有一种API方法来显示用户的最新活动:

public List<UserActivity> GetUserActivity(Guid userId)
{
    return _dbContext.UserActivity
               .Where(ua => ua.UserId.Equals(userId))
               .OrderByDescending(ua => ua.ActivityTime)
               .Take(20)
               .ToList();
}

这些是我要返回的对象:

public class UserActivity
{        
    public Guid UserId { get; set; }
    public DateTime ActivityTime { get; set; }
    public string ActivityTitle { get; set; }
}

我正在在数据库中存储ActivityTime的所有日期。每个用户都可以设置所在的时区,因此我想将ActivityTime转换为其时区,以在调用此API方法时在前端显示。

类似的东西:

public List<UserActivity> GetUserActivity(Guid userId)
{
    MyUser user = _dbContext.MyUsers.FirstOrDefault(u => u.Id.Equals(userId));
    TimeZoneInfo userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(user.TimeZoneId);
    return _dbContext.UserActivity
               .Where(ua => ua.UserId.Equals(userId))
               .OrderByDescending(ua => ua.ActivityTime)
               .Take(20)
               // somehow call TimeZoneInfo.ConvertTimeFromUtc on ActivityTime here
               .ToList();
}

,但我不确定如何在集合中的属性上调用TimeZoneInfo.ConvertTimeFromUtc来转换所有这些。有办法做到吗?

在内存中拥有所有UserActivity数据后,您就可以转换它。

var activities = ...;
TimeZoneInfo userZone = TimeZoneInfo.FindSystemTimeZoneById(user.TimeZoneId);
foreach (var thisActivity in activities)
{
    DateTime localTime = 
       TimeZoneInfo.ConvertTimeFromUtc(thisActivity.ActivityTime, userZone);
    thisActivity.ActivityTime = localTime;
}

您需要做的重要的事情是在 呼叫 ToList() for entityframework dbset。

这是一个通过投影您的实体来使用LINQ的示例:

public List<UserActivity> GetUserActivity(Guid userId)
{
    MyUser user = _dbContext.MyUsers.FirstOrDefault(u => u.Id.Equals(userId));
    TimeZoneInfo userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(user.TimeZoneId);
    var activities = _dbContext.UserActivity
                               .Where(ua => ua.UserId.Equals(userId))
                               .OrderByDescending(ua => ua.ActivityTime)
                               .Take(20)
                               .ToList();
    return activities.Select(a => new UserActivity
    {
        UserId = a.Userid,
        ActivityTitle = a.ActivityTitle,
        ActivityTime = TimeZoneInfo.ConvertTimeFromUtc(a.ActivityTime, userTimeZone)
    }).ToList();
}

相关内容

  • 没有找到相关文章

最新更新