我正在记录哪些用户登录应用程序和时间。我看到时间是基于应用服务器,这是Azure的情况,所以它不是实时的。我有兴趣展示他们登录的实际时间。看来应用服务器是默认的,如何让这个时间更合法?
var loginAudit = new LogInAudit();
loginAudit.CLIENT_IP = FDB.Utils.GetClientIP();
loginAudit.LOGIN_TIME = DateTime.Now;
loginAudit.LOGIN_USER_ID = objUser.LoginID;
loginAudit.LOGOUT_TIME = null;
loginAudit.TYPE = "IN";
loginAudit.USER_ID = objUser.UserID;
db.Entry(loginAudit).State = System.Data.Entity.EntityState.Added;
db.SaveChanges();
答案 0 :(得分:1)
如果您的所有用户都在一个时区,我过去所做的就是将服务器上的时间更改为正确的时间:-)它运行良好。
如果您的用户跨越多个时区,则需要捕获用户所属的时区,并以UTC时间格式存储日期。 UTC时间是通用时间,您可以通过时区转换为本地时间。这就是通常的处理方式。
答案 1 :(得分:1)
显示相对于客户特定时区的日期通常被视为显示问题,无论何时处理存储日期/时间,它几乎总是建议您将它们记录为UTC。目前,您正在根据审核记录记录服务器本地时间,这对您的客户来说绝对没有任何意义。
您要做的是在DB记录中记录当前的UTC时间
loginAudit.LOGIN_TIME = DateTime.UtcNow;
然后在显示时,将其转换回当地时间。
为了做到这一点,你需要文化意识,换句话说,你需要知道客户端所在的时区,以便从UTC转换回本地。例如,如果我是客户,我会在GMT Standard Time
时间工作,所以为了让我看到相对于我的审计时间,你需要做
var gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
var localTime = tzi.ConvertTimeFromUtc(loginAudit.LOGIN_TIME, gmt);
就如何从客户端获取此信息而言,有多种方法可以做到这一点,就像让用户从可用TZ列表(可靠但侵入性)中选择使用3rd party service来查找信息一样基于他们的IP(不是用户的可靠但更好的用户体验) - 我将让你去调查并决定哪个最适合你的应用。
或者,如果您不想处理时区并且只使用日期,您可以将偏移量与UTC时间一起存储,这将为您提供计算后的当地时间 - 请参阅DateTimeOffset。