2016-08-02 23 views
2

このDateTimeOffset 2016-08-01 09:30:00.0000000 -04:00をSQL ServerデータベースからFullCalendarに渡しています。イベントはレンダリングされているようですが、常に4時間先です。私は、代わりにdatetime2を使用していたときと全く同じことをしていたことに注意したい。私はSQL Serverをチェックして、正しい現在時刻を表示しているので、問題の内容がわからない。ASP.NET MVCを使用したFullCalendarのDateTimeOffset

<script type="text/javascript"> 
    $(document).ready(function() 
    { 
     $('#calendar').fullCalendar(
     { 
      header: 
      { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      editable: false, 
      events: "/home/loadevents/" 

     }) 
    }); 
</script> 

のViewModel:

public class CalendarEventsViewModel 
{ 
    //Properties have to conform to the following API standards 
    //or the FullCalendar.js library will reject all incoming data. 
    //http://fullcalendar.io/docs/event_data/Event_Object/ 

    public int id { get; set; } 
    public string title { get; set; } 
    public DateTimeOffset start { get; set; } 
    public DateTimeOffset end { get; set; } 
} 

AcctionResult/LINQの:

public ActionResult LoadEvents (DateTime start, DateTime end) 
{ 

    IEnumerable<CalendarEventsViewModel> model = 
    db.CalendarEvents 
    .Select(r => new CalendarEventsViewModel 
    { 
     id = r.EventID, 
     title = r.EventName, 
     start = r.EventScheduleDateTime, 
     end = r.EventScheduleDateTime, 
    }); 


    return Json(model, JsonRequestBehavior.AllowGet); 
} 

編集:

は、ここに私のFullCalendarの実装ですブレークポイントを詳しく見てみると、2016-08-01 09:30:00.0000000 -04:00をFullCalendarにプッシュするのではなく、8/1/2016 09:30:00 AMをプッシュしていますが、現地時間よりも4時間遅れて表示されています。 dbとmy viewmodelプロパティの両方でdatetimeoffsetを使用していても、オフセットがlinq文のdbから失われているかどうかはわかりません。上記のコードを追加しました。

編集2:

私が間違っていた、それは私は問題がまだあるかわからないので、{8/1/2016 9:30:00 AM -05:00}を送信していますようです。私の推測では、これはFullCalendarの要件に準拠していない可能性がありますか?

編集3:私のデータベースで

私が保存され2016-08-01 09:30:00.0000000 -04:00を持っています。 linqクエリを取得すると、デバッグに応じて8/1/2016 9:30:00 AM -04:00になります。 FullCalendar.jsに日付/イベントが表示されている場合は、午後1時30分にそれより4時間遅れて表示されます。私はオフセットについて何かを誤解しなければならないが、私は何がわからない。

+0

これで進歩しましたか?私は結果を見ることに興味があります。それは個人的なプロジェクトですか、クライアントのためですか?それが個人的であれば、それを公開リポジトリに持っていますか?私はかなり見てみたい、タイムゾーンのサポートは、私はまだFCでプレーする機会を持っていたものではありません。 –

+0

これはクライアントのための小さなプロジェクトです。私は最後の編集以来何もしておらず、ちょうど立ち上がった。私は、これが動作するためにはすべてのコンポーネントが存在すると確信しています。 –

+0

ブラウザのF12ツール、またはFiddlerのようなHTTPツールを使用して、実際のJSON応答の一部を取得します。イベントデータのJSONはどのように見えますか?私の推測では、ISO8601の代わりに[旧式形式](http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx)を返しています。 –

答えて

1

MVCのJsonResult(コントローラのJsonメソッドの呼び出しによって返された)を使用しているため、JSONシリアル化はJavaScriptSerializerクラスによって処理されています。残念ながら、この特定のシリアライザはDateTimeOffsetの値をうまく処理しません。それらをUTCに正規化し、an antiquated formatに表示します。

moment.jsは実際にその形式を読むことができます(したがってFullCalendarも可能ですが)。正規化処理は、すべての時間がUTCとして表示されることを意味し、4時間先に表示されます。

は、あなたがこれを近づいて検討するかもしれない2つの方法があります。

  1. あなたはすべてがlocalthe timezone parameterを設定することで、ユーザーのローカル時間にタイムスタンプを調整するFullCalendarを言うことができます。これにはバックエンドを変更する必要はありませんが、異なるタイムゾーンのユーザーには、イベントの現地時間ではなく、自分自身に対するイベントが表示されます。

  2. JavaScriptSerializerではなく、JSON.Netを使用するようにMVCコードで使用されるシリアライザを変更することができます。デフォルトではJSONです。Netは標準のISO8601形式を使用し、DateTimeOffset値のオフセットを保持します。また

    string json = JsonConvert.SerializeObject(model); 
    return Content(json, "application/json"); 
    

    ASP.Net WebAPIのは、この問題を持っていないことを言及する価値が、:あなたのプロジェクト全体でグローバルにこれを行いたい場合は、代わりに、単純に自分のLoadEvents方法の最後の行を変更することができても、this approachを参照してくださいこれは既定でJSON.Netを既に使用しているためです。

+0

私は最後のアプローチを使い、それは完全に機能しました。私はカレンダーに、その時刻がUTC 0になるように送信されたものを常に表示していることに気がつきました。カレンダーをシステムのタイムゾーンで、ブラウザのローカルタイムゾーンではなくデフォルトにする必要があります。それで、ドロップダウンメニューでタイムゾーンのオプションをいくつか挙げてください。残りの部分は、あなたがこれを理解するのを助けてくれたので、それほど難しいものではありません。ありがとう! –

関連する問題