2012-04-23 7 views
1

私は午前3時から午前5時まで毎晩実行されるWindowsサービスを提供しています。ジョブが実行されると次の処理が行われます。DateTimeを使用した前日のカウントでは、UTC形式の問題が発生します。

var endDate = DateTime.Today.ToUniversalTime(); // Set to midnight 
var startDate = endDate.AddDays(-1); 

夜間に実行されるクエリのようなものを(すべての日付は、現在、UTCとして格納されている)と言う:これは正常に動作します

SELECT * FROM Table WHERE CreatedAt BETWEEN startDate AND endDate 

、それは基本的にすべてのグラブジョブが実行される前日のデータ。私は今、ユーザーがボタンをクリックして夜間に処理されるデータ数を見るためのUI部分を開発中です。

私が遭遇している問題は、通常の営業時間内にユーザーが仕事をしているときにそのボタンをクリックするとカウントが1日遅れることです。このカウントは、UTC時刻の真夜中以降になるため、現地時間が東部沖の午後8時(西海岸に位置している)の後である場合にのみ正しく表示されます。

私のようなものでこれを解決しようとした:

var now = DateTime.Now; 
var midnight = DateTime.Today.ToUniversalTime(); 

var endDate = (now.Day == midnight.Day) ? midnight.AddDays(1) : midnight; 
var startDate = endDate.AddDays(-1); 

しかし、それだけで一日のいくつかの部分の間に動作しますので、これは正しくありません。現地時間の午前0時にボタンをクリックすると、もう一度オフになります。

この問題を解決するためにDateTimeオブジェクトを使用する巧妙な方法はありますか?

答えて

0

UIで現地時間をUTCに変換できます。またはDateTime.UtcNowを使用してください。

var localTimeUtc = TimeZoneInfo.ConvertTimeToUtc(
    DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local)); 

//or (much easier) 
var localTimeUtc = DateTime.UtcNow; 

そして:今

var utcMidnight = localTimeUtc.Date; 
var yesterdayUtcMidnight = midnight.AddDays(-1); 

utcMidnightyesterdayUtcMidnightはで「昨日のすべてをカバーするDateTimeあなたはそれを呼び出すにはKind==DateTimeKind.Localを持っている場合にのみ動作しますとあなたはToUniversalTimeと注意する必要がありますUTC時間。

あなたのWindowsサービスは、昨日のUTCか昨日のローカルのデータを処理することを目的としていますか?データベースの時刻がUTCの場合は、サービスコードが動作するはずですが、ローカル時間(おそらくデフォルトのGetDate()?)であれば、処理のためのコードは機能しません。

関連する問題