因此,我無意中遇到了Azure與UTC時間一起工作的現實。這是可以的,除了我發現這個事實,只有當它被部署! (當它處於調試模式時,它只是使用我的合成時間,所以這被忽略)從UTC日期時間轉換到視圖中的本地日期時間
所以我需要能夠在那裏顯示日期時間。我不介意(並且更喜歡)它是UTC。 但是,我有很多不同的地方,日期在我的應用程序彈出,所以我想知道什麼是快速和骯髒的解決方案,讓所有的顯示器顯示當地時間。我正在考慮爲datetime使用編輯器模板。這是一個好主意嗎?我會用什麼來完成轉換?
因此,我無意中遇到了Azure與UTC時間一起工作的現實。這是可以的,除了我發現這個事實,只有當它被部署! (當它處於調試模式時,它只是使用我的合成時間,所以這被忽略)從UTC日期時間轉換到視圖中的本地日期時間
所以我需要能夠在那裏顯示日期時間。我不介意(並且更喜歡)它是UTC。 但是,我有很多不同的地方,日期在我的應用程序彈出,所以我想知道什麼是快速和骯髒的解決方案,讓所有的顯示器顯示當地時間。我正在考慮爲datetime使用編輯器模板。這是一個好主意嗎?我會用什麼來完成轉換?
請問this對您有幫助嗎?
問題是,您並不真正瞭解用戶在服務器上的時區。你完全可以猜出一個人的文化,但不是一個時區。假設用戶在美國,文化「en-us」至少可以有4個時區。
另一種方法是讓用戶在使用您的網站時選擇/選擇一個優先時區。然後,您可以將此選擇保存在cookie或配置文件中。讓用戶的時區,你可以在方法不同時區之間的轉換與此類似:
var localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, timeZone.TimeZoneInfo);
在您使用靜態方法TimeZoneInfo類型的ConvertTimeFromUtc。並且您還有一個TimeZoneInfo(在我的情況下是我的自定義類型的屬性)實例,該實例保留用戶的TimeZoneInfo設置。
重新回到jQuery solution - 你可以使用它,在document.ready()上調用這個小函數。只需要記住在您的時間顯示字段中添加所需的CSS類。但最終,如果您的目標是多時區訪問者,您可能想要求他們提供經過優化的時區,以便在後端進行轉換,並明確顯示那些時間不是UTC的用戶, t選擇了一個預先設定的時區。
這裏是我想出的編輯器和顯示模板,它允許用戶輸入並在自己的時區顯示時間,並將其轉換爲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;
}
}
這完全是用在我們的管理頁面,所以文本框,顯示爲編輯框轉換的結果後,不是很方便跨度。
我懷疑上面這行會在客戶端瀏覽器上運行。作爲剃刀語法,代碼將通過服務器執行,並將時間轉換爲服務器的本地時區,而不是客戶端。一些純粹的javascript或jquery庫可能會挽救。 – AKS
@AKS當您仔細閱讀答案時,您會注意到它甚至在服務器上建議** **您知道** enduser timezone **。你用它來轉換。 – astaykov