2011-05-11 44 views
9

我們有一個MVC項目,我需要顯示轉​​換爲用戶本地時間的UTC日期。在我的模型我傳遞的UTC日期和在視圖中我試圖做到以下幾點:MVC - UTC日期到LocalTime

<%: Html.DisplayFor(m=> m.SomeDate.ToLocalTime()) %> 

這會拋出異常。任何人都可以指示我如何將UTC日期轉換爲本地日期時間以便在客戶端顯示。我們將把日期存儲爲UTC,並且在顯示時間這些日期將需要轉換爲本地機器等效。

+0

參見相關:[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

+0

你的代碼是服務器端而不是客戶端。我意識到這是在下面的評論標記,但這是一個受歡迎的問題,它的方式不清楚它的要求! – noelicus 2017-06-10 08:45:08

回答

7
DateTime now = DateTime.UtcNow; 
DateTime localNow = TimeZoneInfo.ConvertTimeFromUtc(now, TimeZoneInfo.Local); 
+0

這將需要在服務器端完成,而我在談論客戶端 – Amitesh 2011-05-11 02:50:23

+3

@Amitesh,在你的問題的例子中,你也試圖在服務器端轉換日期。 – 2011-05-11 02:52:09

+0

我試圖將日期轉換爲本地客戶端使用 <%:Html.DisplayFor(m => m.SomeDate.ToLocalTime())%>。 – Amitesh 2011-05-11 03:05:48

9

您將需要存儲的用戶的時區服務器端,然後使用這樣的事情(儘管它應該在控制器,而不是視做):

@TimeZoneInfo.ConvertTimeFromUtc(Model.CreatedOn, TimeZoneInfo.FindSystemTimeZoneById("E. Australia Standard Time")) 
2

感覺就像是位的一個kludge,但這工作在MVC3客戶端

@DateTime.Parse(Html.DisplayFor(m=> m.SomeDate).ToString()).ToLocalTime().ToString() 
+0

我喜歡它。它很乾淨,就坐在那裏。如果你想格式化不同的視圖,很容易 - 很好地完成。它只是看起來像一個雜食。 – 2016-10-26 14:19:42

+3

這看起來對我來說所有的服務器端.... ?? – noelicus 2017-06-07 09:26:15

4

在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信息的結果。

0

使用此代碼爲UTC時間轉換爲本地時間

<%: Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString()) %> 

可以在剃刀

@Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString()) 
+0

我不認爲這有效。您將得到一個異常:System.InvalidOperationException:'模板只能用於字段訪問,屬性訪問,單維數組索引或單參數自定義索引器表達式。 – mikecamimo 2017-08-27 23:02:10

0

所有好的答案使用使用下面的代碼。我做我的是這樣的:

@Html.DisplayFor(m=> m.SomeDate.ToLocalTime().ToString(CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern + " " + CultureInfo.CurrentUICulture.DateTimeFormat.LongTimePattern))

0

轉換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)"