0

在我正在工作的当前项目中,最初的开发人员使用 ASP.NET Membership 来处理用户登录验证。因此,aspnet_Membership 表中的 LastLoginDate 和 LastActivityDate 以 UTC 格式保存。

无论如何以当地时间格式保存它?或者有谁知道可以修改哪个存储过程来补偿时间差(通过使用 DATEADD() 方法)?

4

2 回答 2

1

我会警告不要将数据从 UTC 更改为本地时间。

SqlMembershipProvider返回MembershipUser.LastLoginDate本地时间和其他类似属性:即将数据库值从 UTC 转换为本地时间。

因此,如果您通过MembershipAPI 访问此数据,则无需执行此操作。

如果您正在直接访问数据库中的数据,并且您真的非常希望 SQL Server 在本地时间返回它,那么为什么不在您从数据库中读取数据时进行转换。

例如,您可以在 aspnet_Membership 表上创建一个 VIEW,如下所示:

SELECT 
    ...
    LastLoginDate + GETDATE() - GETUTCDATE() AS LastLoginDateLocal
    ...
FROM aspnet_Membership

请注意,通过在 SQL Server 中进行转换,您将获得 SQL Server 的本地时间,这可能与托管应用程序的计算机上的本地时间不同。

更新

来自评论:

我想知道为什么@Leo 方法不起作用。

@Leo 建议修改aspnet_Membership_UpdateUserInfoSP;您需要修改所有更新您感兴趣的列的 SP。例如,LastLoginDate也更新为aspnet_Membership_UpdateUser.

此外,如果您采用这种方法,MembershipUser.LastLoginDate属性中返回的时间将不正确,因为SqlMembershipProvider代码假定数据库值是 UTC。要更正此问题,您需要修改选择此列的所有成员资格 SP,以转换回 UTC。例如aspnet_Membership_GetAllUsers, aspnet_Membership_FindUsersByEmail, aspnet_Membership_FindUsersByName, ...

另请注意,由于 DST,如上所述在 SQL Server 中的 UTC 和本地之间转换有时会给出不正确的值 (+/- 1h)(例如,在 DST 运行期间计算差异 GETDATE() - GETUTCDATE(),但是用户在 DST 开始之前最后一次登录)。

最好将数据库值保留为 UTC 并在应用程序中进行任何转换的另一个原因。

于 2012-10-10T07:38:55.430 回答
1

aspnet_Membership_UpdateUserInfo是更新LastLoginDate. 您可以根据需要修改此 SP 并转换数据格式。

于 2012-10-10T06:51:59.177 回答