2012-01-24 518 views
4

因此,我無意中遇到了Azure與UTC時間一起工作的現實。這是可以的,除了我發現這個事實,只有當它被部署! (當它處於調試模式時,它只是使用我的合成時間,所以這被忽略)從UTC日期時間轉換到視圖中的本地日期時間

所以我需要能夠在那裏顯示日期時間。我不介意(並且更喜歡)它是UTC。 但是,我有很多不同的地方,日期在我的應用程序彈出,所以我想知道什麼是快速和骯髒的解決方案,讓所有的顯示器顯示當地時間。我正在考慮爲datetime使用編輯器模板。這是一個好主意嗎?我會用什麼來完成轉換?

回答

0

請問this對您有幫助嗎?

問題是,您並不真正瞭解用戶在服務器上的時區。你完全可以猜出一個人的文化,但不是一個時區。假設用戶在美國,文化「en-us」至少可以有4個時區。

另一種方法是讓用戶在使用您的網站時選擇/選擇一個優先時區。然後,您可以將此選擇保存在cookie或配置文件中。讓用戶的時區,你可以在方法不同時區之間的轉換與此類似:

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

在您使用靜態方法TimeZoneInfo類型的ConvertTimeFromUtc。並且您還有一個TimeZoneInfo(在我的情況下是我的自定義類型的屬性)實例,該實例保留用戶的TimeZoneInfo設置。

重新回到jQuery solution - 你可以使用它,在document.ready()上調用這個小函數。只需要記住在您的時間顯示字段中添加所需的CSS類。但最終,如果您的目標是多時區訪問者,您可能想要求他們提供經過優化的時區,以便在後端進行轉換,並明確顯示那些時間不是UTC的用戶, t選擇了一個預先設定的時區。

+0

我懷疑上面這行會在客戶端瀏覽器上運行。作爲剃刀語法,代碼將通過服務器執行,並將時間轉換爲服務器的本地時區,而不是客戶端。一些純粹的javascript或jquery庫可能會挽救。 – AKS

+0

@AKS當您仔細閱讀答案時,您會注意到它甚至在服務器上建議** **您知道** enduser timezone **。你用它來轉換。 – astaykov

1

這裏是我想出的編輯器和顯示模板,它允許用戶輸入並在自己的時區顯示時間,並將其轉換爲UTC提交。

它要求將UIHint屬性設置爲每個模型UTC DateTime字段的自定義值「UTCTime」,如下所示,以選擇正確的顯示和編輯器模板。 DateTime是否在模型中沒有這個註釋將不受影響:

[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; 
    } 

} 

這完全是用在我們的管理頁面,所以文本框,顯示爲編輯框轉換的結果後,不是很方便跨度。

相關問題