0

私が取り組んでいる現在のプロジェクトでは、最初の開発者は ASP.NET メンバーシップを使用してユーザーのログイン検証を処理していました。そのため、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ます。

また、このアプローチに従う場合、コードはデータベースの値が UTC であると想定しているMembershipUser.LastLoginDateため、プロパティに返される時刻は正しくありません。SqlMembershipProviderこの問題を解決するには、この列を選択するすべてのメンバーシップ SP を変更して、UTC に戻す必要があります。例aspnet_Membership_GetAllUsers, aspnet_Membership_FindUsersByEmail, aspnet_Membership_FindUsersByName, ...

また、上記のように SQL Server で UTC とローカルを変換すると、DST が原因で誤った値 (+/- 1h) が返される場合があることにも注意してください (たとえば、GETDATE() - GETUTCDATE() の差は、DST が運用されている期間中に計算されますが、 DST の開始前に最後にログインしたユーザー)。

データベースの値を UTC のままにし、アプリケーションで変換を行う方がよいもう 1 つの理由です。

于 2012-10-10T07:38:55.430 に答える