4

私はしばらくの間、これに対するある種の解決策を見つけようとグーグルで検索してきましたが、ほとんど運がありませんでした。

1 日分のデータに相当する一連のレコードを取得しようとしています。1 日分のデータは 4:00:00EST ~ 3:59:59EST です。結果のセットをユーザーに表示するとき、結果をユーザーの現地時間 (私の場合は CST) で表示したいと考えています。これは通常、次の場合を除いてそれほど難しくありません。

  • データベースのタイムスタンプはすべて GMT です。
  • データベースの現地時間は EST です。
  • 私の現地時間はCSTです。

データベースの時刻は EST ですが、レコードは GMT で保存されているため、単純に GETDATE() を呼び出して調整することはできません。

また、C# で LINQ/Entity Framework 4.1 Code-First を使用していて、ヒットしているデータベースが Sybase であることも注目に値します。

では、上記の情報を考慮して、データを GMT からユーザーの現地時間に変換する確実な方法は何でしょうか?

4

1 に答える 1

5

私はこれをかなり考えすぎていたことが判明しましたが、解決策は実際には非常に簡単です。次のリンクは非常に役に立ちました。

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() を呼び出してから、タイム ゾーンの変換やその他のロジックを実行する必要があります。

于 2012-05-10T23:56:04.670 に答える