私が取り組んでいる現在のプロジェクトでは、最初の開発者は ASP.NET メンバーシップを使用してユーザーのログイン検証を処理していました。そのため、aspnet_Membership テーブルの LastLoginDate と LastActivityDate は UTC 形式で保存されます。
現地時間形式で保存する方法はありますか? または、(DATEADD() メソッドを使用して) 時間差を補正するためにどのストアド プロシージャを変更できるか知っている人はいますか?
私が取り組んでいる現在のプロジェクトでは、最初の開発者は ASP.NET メンバーシップを使用してユーザーのログイン検証を処理していました。そのため、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
ます。
また、このアプローチに従う場合、コードはデータベースの値が 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 つの理由です。