[英]Is is possible to change the date format of the LastLoginDate in the aspnet_membership table?
在我正在工作的当前项目中,初始开发人员使用ASP.NET Membership来处理用户登录验证。 因此,aspnet_Membership表中的LastLoginDate和LastActivityDate以UTC格式保存。
无论如何以当地时间格式保存它? 或者有谁知道可以修改哪个存储过程来补偿时差(通过使用DATEADD()方法)?
aspnet_Membership_UpdateUserInfo
是更新LastLoginDate
的Sp。 您可以修改此SP并根据您的要求转换数据格式。
我会提醒您不要将数据从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的本地时间,这可能与托管应用程序的计算机上的本地时间不同。
UPDATE
来自评论:
我想知道为什么@Leo方法不起作用。
@Leo建议修改aspnet_Membership_UpdateUserInfo
SP; 您需要修改更新您感兴趣的列的所有SP。例如, LastLoginDate
也由aspnet_Membership_UpdateUser
更新。
此外,如果您遵循此方法,则MembershipUser.LastLoginDate
属性中返回的时间将不正确,因为SqlMembershipProvider
代码假定数据库值为UTC。 要解决此问题,您需要修改SELECT此列的所有Membership SP,以转换回UTC。 例如aspnet_Membership_GetAllUsers
, aspnet_Membership_FindUsersByEmail
, aspnet_Membership_FindUsersByName
,...
另请注意,由于DST,在SQL Server中UTC和本地之间的转换有时会给出不正确的值(+/- 1h)(例如,差异GETDATE() - GETUTCDATE()是在DST运行期间计算的,但是用户上次在DST启动之前登录)。
为什么最好将数据库值保留为UTC,并在应用程序中进行任何转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.