在视图中从UTC日期时间转换为本地日期时间

时间:2012-01-24 23:40:18

标签: javascript asp.net-mvc-3 datetime azure azure-sql-database

所以我无意中遇到了Azure使用UTC时的现实。这是好的,除了我在部署时发现它的事实! (当它处于调试模式时,它只使用我的comps时间,所以这被忽略了)

所以我需要能够随时向用户显示日期时间。我不介意(并且更喜欢)它是UTC。 但是我的应用程序中有很多不同的地方,所以我想知道什么是快速而肮脏的解决方案,让所有显示器显示当地时间。我正在考虑使用编辑器模板进行日期时间。这是一个好主意吗?我将用什么来进行转换?

1 个答案:

答案 0 :(得分:1)

以下是我提出的编辑器和显示模板,允许用户输入并在自己的时区中显示时间,并将其转换为UTC以进行提交。

它需要将UIHint属性设置为每个模型UTC DateTime字段的自定义值“UTCTime”,如下所示,以选择正确的显示和编辑器模板。没有此注释的模型中的DateTimes将不受影响:

    [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扩展: \控制器\扩展\ 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;
    }

}

这仅用于我们的管理页面,因此在显示编辑框转换结果的文本框后面没有非常友好的用户范围。