0

私たちのアプリケーションの簡単な概要を説明することから始めましょう! (非常に単純なシナリオです。説明を書いただけです!) 私たちは、ASP.NET Web サイトを持っています。ほとんどが C# で、私たちのすべての店舗の店頭として機能します。フランチャイズ。

各店舗は異なるタイムゾーンにある可能性がありますが、店舗が開いているか閉じているかをサイトに表示する必要があります.

サーバーには、asp.net Web サイトで表示できるさまざまな店舗のさまざまなタイム スケジュールを示す行を保持する DB があります。

私のデータベースには、場所のオフセットを保持する列と行があり、UTC で時間を格納しています。例;

  • ロケーションID: 21
  • TimeZoneOffSet: -5:00
  • 日曜開場: 15:45
  • 日曜定休日: 16:20

その場所が開いているかどうかをサーバー上で判断する方法を考え出しました。サマータイムで動作するかどうかを判断するのに苦労しています. 私の質問は、これは夏時間を考慮しているのか、そしてこのような時間を扱っていないので、このシナリオを正しく行ったのでしょうか?

サーバー側のコードで行うことは次のとおりです。

//これは、DB からストア スケジュールを保持するために使用するクラスの重要な部分です。

public class TimeSchedule
{
    public TimeSpan locationOffset { get; set; }
    public TimeSpan sundayOpen { get; set; }
    public TimeSpan sundayClose { get; set; }

    public TimeSchedule()
    {
        locationOffset = new TimeSpan();
        sundayOpen = new TimeSpan();
        sundayClose = new TimeSpan();
    }

}

//I have loaded a TimeSchedule object by id
TimeSchedule schedule = location.getTimeScheduleByLocationID(21);

// Get the UTC time
DateTime utcNow = new DateTime();
utcNow = DateTime.UtcNow;

//Get the offset value that we stored in our schedule object
TimeSpan locationOffSetHour = schedule.locationOffset;

//I then apply the location offset hour to the server utc time.
DateTime locationTime = new DateTime();
locationTime = utcNow.Add(locationOffSetHour);

 // Get the day of the week from our locationTime that we off setted from UTC
 string LocationWeekDay = locationTime.DayOfWeek.ToString();

// Now for each case of week day, I check to see if the difference in time is >= 0
// If so I assume the store is open



 TimeSpan zeroDifference = new TimeSpan(0, 0, 0);


   // This switch case just gets the difference in time according to LocationTime (that we offset'd from UTC) and stored time for the location on the server.
   // Then verifies that the location is open for that day  
   switch (LocationWeekDay)
      {
          case "Sunday":
              // Verify that location is open, turn on open sign
              TimeSpan differenceOpenTimeSun = new TimeSpan();
              differenceOpenTimeSun = locationTime.TimeOfDay - schedule.sundayOpen;

          TimeSpan differenceCloseTimeSun = new TimeSpan();
          differenceCloseTimeSun = schedule.sundayClose - locationTime.TimeOfDay;

          if (differenceOpenTimeSun >= zeroDifference && differenceCloseTimeSun > zeroDifference)
           {

               imgSign.ImageUrl = "~/SiteImages/open.jpg";
            }
            else
            {
               imgSign.ImageUrl = "~/SiteImages/closed.jpg";
            }
            break;
}

私の解決策を見てくれてありがとう!「ヘッズアップ」または「ノーノー」も大歓迎です!

4

3 に答える 3

2

自由にリファクタリングしました。おそらくデータベースの開始値と終了値を非正規化するので、すべてをこのように正確に行うとは言いませんが...ここにあります...

//I have loaded a TimeSchedule object by id 
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(schedule.LocationId); 

// Get the UTC time 
DateTime utcNow = DateTime.UtcNow; 

//I then apply the location offset hour to the server utc time. 
DateTime currentUtcTime = DateTime.UtcNow; 
DateTime locationTime = TimeZoneInfo.ConvertTimeFromUtc(currentUtcTime, tzi);

// Get the day of the week from our locationTime that we off setted from UTC 
string locationWeekDay = locationTime.DayOfWeek.ToString(); 

// Now for each case of week day, I check to see if the difference in time is >= 0 
// If so I assume the store is open 
TimeSpan zeroDifference = new TimeSpan(0, 0, 0); 

// This switch case just gets the difference in time according to LocationTime (that we offset'd from UTC) and stored time for the location on the server. 
// Then verifies that the location is open for that day   
switch (locationWeekDay) 
{ 
     case "Sunday":  
          // Verify that location is open, turn on open sign  
          TimeSpan differenceOpenTimeSun = currentUtcTime.TimeOfDay - schedule.sundayOpen;  
          TimeSpan differenceCloseTimeSun = schedule.sundayClose - currentUtcTime.TimeOfDay;  

          if (differenceOpenTimeSun >= zeroDifference && differenceCloseTimeSun > zeroDifference)  
           {  

           imgSign.ImageUrl = "~/SiteImages/open.jpg";  
        }  
        else  
        {  
           imgSign.ImageUrl = "~/SiteImages/closed.jpg";  
        }  
        break;  

}

于 2012-06-04T19:22:31.310 に答える
1

プログラムの次のコード行は、タイムゾーンを処理し、現地時間を取得しています。

// Get the UTC time
DateTime utcNow = new DateTime();
utcNow = DateTime.UtcNow;

//Get the offset value that we stored in our schedule object
TimeSpan locationOffSetHour = schedule.locationOffset;

//I then apply the location offset hour to the server utc time.
DateTime locationTime = new DateTime();
locationTime = utcNow.Add(locationOffSetHour);

ただし、このコードはタイム ゾーン オフセット値の追加のみを処理しており、DST の処理は行っていません。

したがって、DST も取得したい場合は、次の 2 つのオプションがあります。

  1. 場所の DST 期間ごとにデータベースの列を使用し、ロジックを実行して、その地域の現在の日付が DST 期間内にあるかどうかを調べ、それに応じて DST の変更を行います。
  2. .NET 3.5 以降を使用している場合は、このオプションに従うことができます。

    DateTime 東部 = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "東部標準時");

    TimeZoneInfoクラスは、.NET 3.5 以降でのみ使用できます。

于 2012-06-04T18:33:52.107 に答える
0

いくつかの提案とコメント...


C# の TimeZoneInfo クラスを見てください。 http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

タイムゾーン変換を正確にするいくつかのメソッドが含まれています。たとえば、TimeZoneOffset をデータベースに格納する代わりに、TimeZoneId を格納できます。次に使用...

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(string id);

次に、代わりに..

locationTime = utcNow.Add(locationOffSetHour);  

できるよ...

 DateTime locationTime = ConvertTimeFromUtc(utcNow, tzi) ;

現地時間を取得します。これにより、サマータイムがサポートされるため、より正確なオフセットが得られます。

他のすべてのコードを確認し、TimeZoneInfo クラスに独自のロールの代わりに使用できるプロパティとメソッドが含まれているかどうかを確認します。


また、値を初期化してすぐに上書きする必要もありません...

// Change this...
DateTime utcNow = new DateTime();                
utcNow = DateTime.UtcNow;        

// to this...
DateTime utcNow = DateTime.UtcNow;        

// and this...
TimeSpan differenceOpenTimeSun = new TimeSpan();               
differenceOpenTimeSun = locationTime.TimeOfDay - schedule.sundayOpen;  

// to this...
TimeSpan differenceOpenTimeSun = locationTime.TimeOfDay - schedule.sundayOpen;  

// etc...

データベースに時刻をUTCで保存しているとあなたは言います。これを行っているので、このコードの外のどこかでそれを現地時間に変換していると思います...

differenceCloseTimeSun = schedule.sundayClose - locationTime.TimeOfDay

差を計算する前に変換を行う必要がないように、両方の値に UTC 時間を使用することを検討してください。

おそらく、曜日を判断するためにタイムゾーンの変換を行う必要がありますが、店舗が開いているか閉まっているかを判断するために変換を行う必要はありません。


標準の命名規則を実際に使用していません。必須ではありませんが、出発点として Microsoft Standards をお勧めします。StackOverflow で質問するときにコードを読みやすくします :)

http://msdn.microsoft.com/en-us/library/ff926074.aspx

これがお役に立てば幸いです。

于 2012-06-04T19:04:08.480 に答える