私が思いついたエディタとディスプレイテンプレートは、ユーザーが自分のタイムゾーンに時間を入力して表示し、送信するために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;
}
}
これが私たちの管理ページのみに使用されているので、編集ボックスの変換の結果を示しているテキストボックスの後にはない非常にユーザーフレンドリースパンがあります。
上記の行がクライアントブラウザで実行されると思われます。剃刀の構文では、コードはサーバー上で実行され、クライアントではなくサーバーのローカルタイムゾーンに時刻を変換します。いくつかの純粋なjavascriptまたはjqueryライブラリが救助するかもしれません。 – AKS
@AKSあなたが慎重に答えを読んだら、あなたは**エンドユーザのタイムゾーン**を知っていることをサーバーにも**示唆していることに気付くでしょう。そしてそれを使って変換します。 – astaykov