我們有一個MVC項目,我需要顯示轉換爲用戶本地時間的UTC日期。在我的模型我傳遞的UTC日期和在視圖中我試圖做到以下幾點:MVC - UTC日期到LocalTime
<%: Html.DisplayFor(m=> m.SomeDate.ToLocalTime()) %>
這會拋出異常。任何人都可以指示我如何將UTC日期轉換爲本地日期時間以便在客戶端顯示。我們將把日期存儲爲UTC,並且在顯示時間這些日期將需要轉換爲本地機器等效。
我們有一個MVC項目,我需要顯示轉換爲用戶本地時間的UTC日期。在我的模型我傳遞的UTC日期和在視圖中我試圖做到以下幾點:MVC - UTC日期到LocalTime
<%: Html.DisplayFor(m=> m.SomeDate.ToLocalTime()) %>
這會拋出異常。任何人都可以指示我如何將UTC日期轉換爲本地日期時間以便在客戶端顯示。我們將把日期存儲爲UTC,並且在顯示時間這些日期將需要轉換爲本地機器等效。
DateTime now = DateTime.UtcNow;
DateTime localNow = TimeZoneInfo.ConvertTimeFromUtc(now, TimeZoneInfo.Local);
您將需要存儲的用戶的時區服務器端,然後使用這樣的事情(儘管它應該在控制器,而不是視做):
@TimeZoneInfo.ConvertTimeFromUtc(Model.CreatedOn, TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time"))
感覺就像是位的一個kludge,但這工作在MVC3客戶端
@DateTime.Parse(Html.DisplayFor(m=> m.SomeDate).ToString()).ToLocalTime().ToString()
我喜歡它。它很乾淨,就坐在那裏。如果你想格式化不同的視圖,很容易 - 很好地完成。它只是看起來像一個雜食。 – 2016-10-26 14:19:42
這看起來對我來說所有的服務器端.... ?? – noelicus 2017-06-07 09:26:15
在mvc中,您可以通過操作過濾器來解決此問題。 請使用以下步驟:
1)在會話中存儲客戶端時區偏移量信息。
2)創建DatetimeConverter助手類。
public class DateTimeConverter
{
public static DateTime? ToLocalDatetime(DateTime? serverDate, int offset)
{
if (serverDate == null) return null;
return serverDate.Value.AddMinutes(offset * -1);
}
}
3)。創建動作過濾器。
public class LocalDateTimeConverter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var model = filterContext.Controller.ViewData.Model;
if (model != null && filterContext.HttpContext.Session["LocalTimeZoneOffset"] != null)
ProcessDateTimeProperties(model, filterContext);
base.OnActionExecuted(filterContext);
}
private void ProcessDateTimeProperties(object obj, ActionExecutedContext filterContext)
{
if (obj.GetType().IsGenericType)
{
foreach (var item in (IList)obj)
{
ProcessDateTimeProperties(item, filterContext);
}
}
else
{
TypeAccessor member;
List<PropertyInfo> props = new List<PropertyInfo>();
props.AddRange(obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty).ToList());
member = TypeAccessor.Create(obj.GetType());
foreach (PropertyInfo propertyInfo in props)
{
if (propertyInfo.PropertyType == typeof(DateTime) || propertyInfo.PropertyType == typeof(DateTime?))
{
{
member[obj, propertyInfo.Name] = DateTimeConverter.ToLocalDatetime((DateTime?)propertyInfo.GetValue(obj), ((int)filterContext.HttpContext.Session["LocalTimeZoneOffset"]));
}
}
else if (propertyInfo.PropertyType.IsGenericType && propertyInfo.GetValue(obj) != null)
{
foreach (var item in (IList)propertyInfo.GetValue(obj))
{
ProcessDateTimeProperties(item, filterContext);
}
}
}
}
}
}
4)。應用LocalDateTimeConverter過濾器包含要返回視圖的模型數據。
經過這些步驟後,您可以在視圖中看到包含轉換爲本地dateTime的dateTime信息的結果。
使用此代碼爲UTC時間轉換爲本地時間
<%: Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString()) %>
可以在剃刀
@Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString())
我不認爲這有效。您將得到一個異常:System.InvalidOperationException:'模板只能用於字段訪問,屬性訪問,單維數組索引或單參數自定義索引器表達式。 – mikecamimo 2017-08-27 23:02:10
所有好的答案使用使用下面的代碼。我做我的是這樣的:
@Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString(CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern + " " + CultureInfo.CurrentUICulture.DateTimeFormat.LongTimePattern))
轉換UTC日期時間可以LOCALDATE使用jQuery以及完成。使用jquery的主要好處是你可以在azure上託管你的網站。上面給出的一些方法將不起作用。只有一個選項會被用於使用jquery/javascript。由於Datetime.Now如果您的網站託管在Azure上,將返回utc timetimetime.now.tolocaltime()。請在jquery中找到一個例子來將UTC時間轉換爲localdatetime。
var date = new Date('2/8/2018 3:57:48 PM UTC');
date.toString() // "Thu Feb 08 2018 21:27:48 GMT+0530 (India Standard Time)"
參見相關:[http://stackoverflow.com/questions/4066275/c-utc-to-users-local-time](http://stackoverflow.com/questions/4066275/c-utc -to-users-local-time) – 2011-05-11 02:49:12
你的代碼是服務器端而不是客戶端。我意識到這是在下面的評論標記,但這是一個受歡迎的問題,它的方式不清楚它的要求! – noelicus 2017-06-10 08:45:08