4

Так что я непреднамеренно выступит против реальности, что Azure работает с временем UTC. Это нормально, за исключением того, что я нашел это только тогда, когда он был развернут! (Когда он находится в режиме отладки, он просто использует мое время comps, поэтому это было упущено)Преобразование из UTC Datetime в local datetime в View

Так что мне нужно иметь возможность просто отображать дату и время для пользователя, как есть. Я не против (и предпочитаю) это в UTC. Тем не менее, у меня есть много разных мест, которые даты появляются в моем приложении, поэтому мне интересно, какое быстрое и грязное решение получить все дисплеи, показывающие местное время. Я думал об использовании шаблона редактора для datetime. Это хорошая идея? Что я буду использовать для преобразования?

ответ

0

Will this поможет вам?

Проблема в том, что вы не знаете часовой пояс пользователя на сервере. Вы могли бы в лучшем случае угадать свою культуру, но не часовой пояс. И культура «en-us» может иметь как минимум 4 часовых пояса, если пользователь находится в США.

Другим подходом было бы предложить пользователю выбрать/выбрать предпочтительный часовой пояс при работе с вашим сайтом. Затем вы можете сохранить этот выбор в файле cookie или профиле. Имея часовой пояс пользователя, вы можете конвертировать между часовыми поясами в методе примерно так:

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

Где вы используете статический метод ConvertTimeFromUtc из TimeZoneInfo типа. А также у вас есть экземпляр TimeZoneInfo (в моем случае это свойство моего пользовательского типа), которое сохраняет настройку пользователя TimeZoneInfo.

Возвращаясь к jQuery solution - вы можете использовать это, называя эту маленькую функцию на document.ready(). Просто вы должны иметь в виду добавить желаемый класс css в поля отображения времени.

Но в конце, если вы настроили таргетинг на посетителей с многократной зоной, вы можете запросить у них предпочтительный часовой пояс, чтобы сделать преобразование на бэкэнд, и явно показывать, что время указано в UTC для пользователей, t выбрал выбранный TimeZone.

+0

Я подозреваю, что указанная выше строка будет запущена в браузере клиента. Являясь синтаксисом бритвы, код будет выполняться над сервером и будет преобразовывать время в локальный часовой пояс сервера, а не клиент. некоторые чистые библиотеки javascript или jquery могут спастись. – AKS

+0

@AKS Когда вы внимательно прочитаете ответ, вы заметите, что он предлагает даже ** на сервере **, вы знаете часовой пояс ** enduser **. И вы используете его для преобразования. – astaykov

1

Здесь представлены шаблоны редактора и дисплея, которые позволяют пользователю вводить и отображать время в своем собственном часовом поясе и преобразовать его в UTC для отправки.

Для атрибута UIHint для пользовательского значения «UTCTime» для каждого поля UTC DateTime модели, как показано ниже, требуется выбрать правильные шаблоны отображения и редактора. 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) 

\ Views \ Shared \ 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; 
    } 

} 

Это используется исключительно на наших административных страницах, так что не очень удобный промежуток после текстового поля, который показывает результат преобразования для окна редактора.

Смежные вопросы