静态等同于单例——整个应用程序以及所有用户都通用。您需要基于会话的方法来实现这一点。但是,如果您无权访问会话(例如在业务库中),则可以使用单例方法(代码示例如下。)
编辑:使用单例方法实现此目的的代码示例(类似于静态但更易于维护)。它使用 EF 代码优先的方法,所以如果你不使用 EF,你应该适应它:
编辑2:这是你应该如何使用它:
要获取用户时区的时间:
var userId = 5; // assuming 5 a valid user. If not found, current local timezone will be used (`DateTime.Now`)
var localTime = UserDateTime.Instance.GetTime(userId);`
如果添加了新用户或修改了现有用户,您可以重新加载时区:(您可以根据需要进一步优化。)
UserDateTime.Instance.LoadTimezones();
执行:
namespace YourApp
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
class UserDateTime
{
public static readonly UserDateTime Instance = new UserDateTime();
private UserDateTime() // singleton
{
LoadTimezones();
}
private Dictionary<int, string> _userTimezones = new Dictionary<int, string>();
public DateTime GetTime(int userId)
{
if (_userTimezones.ContainsKey(userId))
return TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(_userTimezones[userId]));
else
return DateTime.Now; // You could throw an error.
}
public void LoadTimezones()
{
using (var db = new YourDbContext())
{
_userTimezones = db.UserTimezones.ToDictionary(t => t.UserId, t => t.TimezoneId);
}
}
}
class UserTimezone
{
public int UserId { get; set; }
public string TimezoneId { get; set; }
}
class YourDbContext : DbContext
{
public DbSet<UserTimezone> UserTimezones { get; set; }
}
}
编辑:源自ASP Security Kit。