在我正在工作的当前项目中,最初的开发人员使用 ASP.NET Membership 来处理用户登录验证。因此,aspnet_Membership 表中的 LastLoginDate 和 LastActivityDate 以 UTC 格式保存。
无论如何以当地时间格式保存它?或者有谁知道可以修改哪个存储过程来补偿时间差(通过使用 DATEADD() 方法)?
在我正在工作的当前项目中,最初的开发人员使用 ASP.NET Membership 来处理用户登录验证。因此,aspnet_Membership 表中的 LastLoginDate 和 LastActivityDate 以 UTC 格式保存。
无论如何以当地时间格式保存它?或者有谁知道可以修改哪个存储过程来补偿时间差(通过使用 DATEADD() 方法)?
我会警告不要将数据从 UTC 更改为本地时间。
SqlMembershipProvider
返回MembershipUser.LastLoginDate
本地时间和其他类似属性:即将数据库值从 UTC 转换为本地时间。
因此,如果您通过Membership
API 访问此数据,则无需执行此操作。
如果您正在直接访问数据库中的数据,并且您真的非常希望 SQL Server 在本地时间返回它,那么为什么不在您从数据库中读取数据时进行转换。
例如,您可以在 aspnet_Membership 表上创建一个 VIEW,如下所示:
SELECT
...
LastLoginDate + GETDATE() - GETUTCDATE() AS LastLoginDateLocal
...
FROM aspnet_Membership
请注意,通过在 SQL Server 中进行转换,您将获得 SQL Server 的本地时间,这可能与托管应用程序的计算机上的本地时间不同。
更新
来自评论:
我想知道为什么@Leo 方法不起作用。
@Leo 建议修改aspnet_Membership_UpdateUserInfo
SP;您需要修改所有更新您感兴趣的列的 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 并在应用程序中进行任何转换的另一个原因。
aspnet_Membership_UpdateUserInfo
是更新LastLoginDate
. 您可以根据需要修改此 SP 并转换数据格式。