私はこれをかなり考えすぎていたことが判明しましたが、解決策は実際には非常に簡単です。次のリンクは非常に役に立ちました。
http://iamacera.org/default.aspx?section=develop/code%20snippets&id=76
http://msdn.microsoft.com/en-us/library/ms973825.aspx
データベースにクエリを実行する前に、次の変数を設定しました。
DateTime utcBeginDateTime = DateTime.UtcNow.Date.AddHours(8);
DateTime utcEndDateTime = utcBeginDateTime.AddDays(1);
これにより、 2012 年 5 月 10 日 8:00:00 AM から 2012 年 5 月 11 日 8:00:00 AM までのUTC時間が得られます。これを EST に変換するのはかなり簡単です。
TimeZoneInfo estZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(utcBeginDateTime, estZone);
これにより、 2012 年 5 月 10 日 4:00:00 AMのEST時間が得られます。
私のLINQクエリでこれを使用する:
var timeQuery = from p in db.cl_contact_event
where p.time_of_contact >= utcBeginDateTime && p.time_of_contact < utcEndDateTime
select new
{
time = TimeZoneInfo.ConvertTimeFromUtc(p.time_of_contact.Value, estZone),
id = p.id
};
.AsEnumerable() を使用してクライアントでクエリを実行しない限り、 TimeZoneInfo.ConvertTimeFromUtc()がおそらく機能しないことは何の価値もありません。私たちのバージョンの Sybase では確実に動作しないことはわかっています。したがって、結果をできる限りフィルタリングし、.AsEnumerable() を呼び出してから、タイム ゾーンの変換やその他のロジックを実行する必要があります。