4

だから私は、AzureがUTC時間で動作するという事実に不注意に立ち向かいました。これは、展開されたときにのみこれを見つけたという事実を除いて、大丈夫です! (デバッグモードの時は、私のコンプス時間を使うので、これは見落とされていました)UTC日時からローカル日時に変換する

だから私はそこに時刻としてユーザに日時を表示するだけで済むようにする必要があります。私は気にしません(そして好む)それはUTCにあります。 しかし、私はアプリケーションの中で日付がポップアップする場所がたくさんあるので、現地時間を示すすべての表示を得るにはどうすべきかと思っています。私はdatetimeのためにエディタテンプレートを使用することを考えていました。これは良いアイデアですか?コンバージョンを行うにはどうすればよいですか?

答えて

0

thisをお手伝いしますか?

問題は、サーバー上のユーザーのタイムゾーンがわからないことです。あなたはおそらく自分の文化を推測することはできますが、タイムゾーンはできません。そして文化 "en-us"は、ユーザーが米国にいると仮定して少なくとも4つのタイムゾーンを持つことができます。

もう1つの方法は、サイトで作業するときに、ユーザーが選択したタイムゾーンを選択または選択させることです。このチョイスをクッキーまたはプロファイルに保存することができます。あなたがTimeZoneInfo型の静的メソッドConvertTimeFromUtcを使用

var localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, timeZone.TimeZoneInfo); 

:ユーザーのタイムゾーンを持って、あなたはこれと同様の方法でタイムゾーン間の変換ができます。また、ユーザのTimeZoneInfo設定を保持するTimeZoneInfo(私の場合は私のカスタムタイプのプロパティ)のインスタンスもあります。

jQuery solutionに戻って - この小さな関数をdocument.ready()で呼び出すことができます。ちょうどあなたの時間の表示フィールドに希望のCSSクラスを追加することを念頭に置く必要があります。

最後に、複数のタイムゾーンの訪問者をターゲットにしている場合は、バックエンドでの変換を行うために時間帯を優先するように依頼し、その時間を明示的に表示することができます。優先するTimeZoneを選択しました。

+0

上記の行がクライアントブラウザで実行されると思われます。剃刀の構文では、コードはサーバー上で実行され、クライアントではなくサーバーのローカルタイムゾーンに時刻を変換します。いくつかの純粋なjavascriptまたはjqueryライブラリが救助するかもしれません。 – AKS

+0

@AKSあなたが慎重に答えを読んだら、あなたは**エンドユーザのタイムゾーン**を知っていることをサーバーにも**示唆していることに気付くでしょう。そしてそれを使って変換します。 – astaykov

1

私が思いついたエディタとディスプレイテンプレートは、ユーザーが自分のタイムゾーンに時間を入力して表示し、送信するためにUTCに変換したものです。

正しい表示テンプレートとエディタテンプレートを選択するには、UIHint属性を各モデルUTC DateTimeフィールドのカスタム値 "UTCTime"に設定する必要があります。この注釈のないモデルで日付時刻は影響されません。

[UIHint("UTCTime")] 
    [DataType(DataType.DateTime)] 
    public DateTime LastSeen { get; set; } 

/Views/Shared/EditorTemplatesUTCTime.cshtml:ビュー\

@model DateTime? 
@{ 
    var name = Html.GetFieldNameForModel(); // See the HTML extension at the end of this post 

    var boxName = name + ".Value"; 
    var boxId = name + "_Value"; 
    var divId = name + "_UTC"; 
} 
@Html.TextBoxFor(m => m.Value, new { type = "datetime", onBlur ="$('#" + name + "').val(UTCDateFuncs.ToUTCDate($('#" + boxId + "').val()));$('#" + divId + "').html('UTC:' + $('#" + name + "').val());$('#" + boxId + "').attr('title','UTC:' + $('#" + name + "').val());" })<span id="@divId"></span> 
<script> 
    new function() { 
     var utcVal = $('#@(boxId)').val(); 
     $('#@(boxId)').val(UTCDateFuncs.FromUTCDate(utcVal)); 
     $('#@(boxId)').attr('title', 'converted from UTC ' + utcVal); 
    } 
</script> 
@Html.HiddenFor(m=>m) 

\共有\ DisplayTemplates \ UTCTime.cshtml

@model DateTime? 
@if(Model.HasValue){<span class="UTCTime">@Model</span>} 

サイトテンプレート、またはどこかに必要なjavascript(テンプレートには含まれません):

// UTC Date 
$(function() { 
    $('.UTCTime').each(function() { 
     var oldtext = $(this).html(); 
     var result = UTCDateFuncs.FromUTCDate(oldtext); 

     $(this).html(result); 
     $(this).attr("title", "Converted from UTC " + oldtext); 
    }); 
}); 

var UTCDateFuncs = { 
    ToUTCDate: function (datetext) { 
     try { 

      var n = new Date(datetext); 
      offsetms = n.getTimezoneOffset() * 60 * 1000; 

      n = new Date(n.valueOf() + offsetms); 

      result = n.toDateString() + " " + n.toLocaleTimeString(); 

     } 
     catch (ex) { 
      console.warn("Error converting time", ex); 
     } 
     return result; 
    }, 

    FromUTCDate: function (datetext) { 
     var result; 
     try { 

      var n = new Date(datetext); 
      offsetms = n.getTimezoneOffset() * 60 * 1000; 

      n = new Date(n.valueOf() - offsetms); 

      result = n.toDateString() + " " + n.toLocaleTimeString(); 

     } 
     catch (ex) { 
      console.warn("Error converting time", ex); 
     } 
     return result; 
    } 
}; 

また、このHTML拡張子: \ Controllers \ Extensions \ HtmlExtensionsも使用できます。CS

using System; 
using System.Web.Mvc; 

public static class HtmlExtensions 
{ 

    public static string GetFieldNameForModel<TModel>(this HtmlHelper<TModel> htmlHelper) 
    { 
     var ti = htmlHelper.ViewData.TemplateInfo; 
     var name = ti.HtmlFieldPrefix; 
     return name; 
    } 

} 

これが私たちの管理ページのみに使用されているので、編集ボックスの変換の結果を示しているテキストボックスの後にはない非常にユーザーフレンドリースパンがあります。