2017-09-28 7 views
0

私は 'Time Clock' Webアプリケーションを作成しています。しかし、LocalTimeで時間を表示するためにEditorForを取得するのに問題があります。ベストプラクティスごとに、(DateTimeOffsetを介して)データベースにUTCとして保存されたものがすべてあります。LocalTimeのDateTimeOffsetをDisplay Editorに表示

これを現地時間で表示する方法についての提案はありますが、それでもUTCとして保存しますか?

任意の助けをいただければ幸いです

<div class="form-group"> 
     @Html.LabelFor(model => model.TimeOut, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.TimeOut, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.EditorFor(model => model.DateOut, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.TimeOut, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

のViewModel

[DataType(DataType.Time)] 
    [DisplayFormat(DataFormatString = "{HH:mm}")] 
    public DateTimeOffset TimeIn { get; set; } 

    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{MM, DD, YY}")] 
    public DateTimeOffset DateIn { get; set; } 

    [DataType(DataType.Time)] 
    [DisplayFormat(DataFormatString = "{HH:mm}")] 
    public DateTimeOffset TimeOut { get; set; } 

    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{MM, DD, YY}")] 
    public DateTimeOffset DateOut { get; set; } 

ビュー、あなたが問題を解決するために見たい何かがあるなら、私に教えてください。ありがとう!

+0

おそらくあなた自身のカスタムエディタテンプレートを作る必要があります:https://stackoverflow.com/a/21865067/1043380 – gunr2171

+0

私はそのポストを横目に走ったと思う。現地時間で私のTimeIn EditorForを表示することができると思いますか?私は地元の時間で時間を表示することができたとは思っていませんでした。 –

+0

私は先に進んで顧客のエディタを試みると思いますが、それが解決すれば教えてくれます。ありがとう! –

答えて

0

日時。簡潔でシンプル。明らかではないが、あなたが熟知している必要があることは、「現地時間」のような概念は非常に変種であるということです。 TimeOut.LocalTimeのような操作を行うと、ローカルサーバーの時間となります。これはおそらくである可能性があります。ユーザーの現地時間と異なるです。まず第一に、探しているものを定義する必要があります。そうでない場合は、サーバーのものではなく、ユーザーの時間です。その結果、LocalTimeは役に立たない。

ユーザーのローカルタイムを気にする場合は、ユーザーに提供する必要があります。サーバーがこの情報を識別する方法はありません。これらの日付と時刻の各フィールドの横にタイムゾーンドロップダウンを表示するか、ユーザーが認証されている場合はプロファイルに設定して、送信したすべてのものに使用することができます。

いずれにしても、ユーザーに日付と時間の入力を許可することに問題があります。クライアントとサーバー間でデータを転送するときは、文字列を扱います。 MVCのmodelbinderはこれらの文字列値を便利に解析してDateTimeOffsetのようなより適切な型にバインドしますが、それを有効にするには転記された値はの形式でなければなりません。ユーザーに非常に特殊な方法で何かをさせることは、もちろん災害のレシピであるため、ユーザーに必要な情報を提供する使いやすいインターフェイスを何らかの形で提示する必要があります機会が与えられたので、ユーザを締めます。

このような理由から、親友はHTML5の入力タイプで、具体的にはdatetimeです。 datetime,datetime-localなどのようなものがありますが、現在のブラウザではサポートされておらず、実際にはHTML5仕様で非難される危険性があります。ほとんどすべての現代のブラウザは、「日付」コントロールと「時刻」コントロールの形式をサポートしています(サポートされていなくても、ユーザーが「日付」値や「時刻」 1つの結合された "datetime"値よりも正しく値を返します。

public DateTimeOffset InUtc => 
    TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateIn, TimeZoneIn).Add(TimeIn).ToUniversalTime(); 

public DateTimeOffset OutUtc => 
    TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateOut, TimeZoneOut).Add(TimeOut).ToUniversalTime(); 

もう一つの:あなたのようないくつかのヘルパーのプロパティを追加することができ、その後

[DataType(DataType.Time)] 
public TimeSpan TimeIn { get; set; } 

[DataType(DataType.Date)] 
public DateTime DateIn { get; set; } 

public string TimeZoneIn { get; set; } 

[DataType(DataType.Time)] 
public TimeSpan TimeOut { get; set; } 

[DataType(DataType.Date)] 
public DateTime DateOut { get; set; } 

public string TimeZoneOut { get; set; } 

:このすべてに基づいて

、私はあなたが以下の方法であなたのビューモデルを変更するお勧めしますもの。 UTCで保存していますが(特にUTCで保存しているため)、少なくともタイムゾーンの部分を残しておく必要があります。後でそのタイムゾーンに戻すことができます。また、永続ストアとしてSQL Serverを使用している場合、DateTimeOffsetDATETIMEOFFSETの列タイプに変換され、タイムゾーン部分をエンコードできます。このシナリオでは、UTCに変換する必要はありません。ユーザーのローカルタイム、UTC、またはそれ以外のものとして保存されているかどうかにかかわらず、必要な時間帯にいつでもアクセスできます。しかし、他のデータベースにはUTCのdatetimesのみが必要です。

0

別のプロジェクトから、私はC#からUTC時間を吐き出し、ブラウザ/オペレーティングシステムからのタイムゾーン情報からJavascriptにローカルタイムに変換させました。 C#で、これを使ってJSを読み込みますフォーマットを吐き出すためにそう

、私は出力時間:

DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss") + " UTC") 

あなたに与えます:2017年9月28日18時40分22秒UTC

そして、Javascriptのにそれを養う:

var date = new Date('2017/09/28 18:40:22 UTC'); 

date.toLocaleString({}, { 
       weekday: "short", year: "numeric", month: "short", 
       day: "numeric", hour : "numeric", minute : "numeric" 
      }); 

これは吐き出す:木、2017年9月28日、午前2時40分PM

あなたのニーズに合わせてJS出力をカスタマイズすることもできます。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

保存するには、サーバーにタイムゾーンを渡す必要があります。おそらく、隠しフィールドでタイムゾーンを渡す必要があるため、データベースに保存する前にアクションのUTCに変換できます。

+0

この回答と上記の答えはまさに私が探していたものです。フロントエンドでJSを使って変換する方法があるかもしれないと思っていましたが、私が初心者であるため、そうする知識が不足していました。ありがとうございました! –

+0

JSソリューションの唯一のことは、表示値とポスト値を気にする必要があることです。残念ながら、HTMLでは、フォームフィールドを別の方法で表示する際に一方向だけを表示させるためのメカニズムは提供されていないため、実際に投稿する前に、フォームのsubmitイベントにフックしてすべてのdatetimeをUTCに戻したいとします。それ以外の場合は、サーバーがUTCのdatetimesとして解釈するローカルの日時をポストします。 –

関連する問題