Подтвердить что ты не робот

ASP.NET MVC Controller/Просмотр отображения по местному времени

У меня есть приложение ASP.NET MVC, которое хранит все SQL DateTime в UTC, так что время является постоянным, независимо от часового пояса, с которого клиент ударяет по сайту.

Теперь я хочу повторно отобразить правильное время для пользователя, поэтому в любое время, когда я показываю время в моем представлении, я использую:

timeVariable.ToLocalTime();

Однако .ToLocalTime() основан на сервере, а не на клиенте.

Нужно ли мне обрабатывать это в JavaScript на клиенте?

Я, вероятно, мог бы передать часовой пояс как часть запроса и контролировать контроллер, но я предполагаю, что есть лучший способ сделать это. Или нет?

Заранее благодарим за помощь!

Матф

4b9b3361

Ответ 1

Почти все сайты, которые я видел, которые переводят время в местное время, просят пользователя указать свой часовой пояс при создании учетной записи. Gmail - один из примеров, но есть много других.

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

Ответ 2

Для Asp.Net MVC + jQuery я создал DisplayTemplate и script, чтобы помочь с этим.

Модельный класс:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

public class SampleModelWithDate
{
    [UIHint("UTCTime")]
    [DataType(DataType.DateTime)]
    public DateTime Date { get; set; }
}

DisplayTemplate: Views\Shared\DisplayTemplates\UTCTime.cshtml

@model DateTime
<span class="UTCTime">@Model</span>

Добавить в Views\Shared_Layout.cshtml или в ваш вид:

<script>
    $(function () {
        // Determine timezone offset in milliseconds
        // from: http://www.w3schools.com/jsref/jsref_getTimezoneOffset.asp
        var d = new Date()
        var offsetms = d.getTimezoneOffset() * 60 * 1000;
        $('.UTCTime').each(function () {
            try
            {
                var text = $(this).html();

                var n = new Date(text);
                n = new Date(n.valueOf() - offsetms);

                $(this).html(n.toDateString() + " " + n.toLocaleTimeString());

                $(this).attr("Converted from UTC " + text);
            }
            catch (ex) {
                console.warn("Error converting time", ex);
            }
        });
    });
</script>

Почистите немного, конечно, немного подробней, чтобы вы могли видеть, что происходит.

Ответ 3

В дополнение к ответу Деррика, Msgstr "Добавить" UTC "в строку перед преобразованием его в дату в javascript." Преобразовать время даты UTC в локальное время с использованием JavaScript

UTCTime может быть автоматически преобразовано в локальное время.

<script>
    $(function () {
        var d = new Date()
        $('.UTCTime').each(function () {
            try
            {
                var text = $(this).html() + ' UTC'; //Append ' UTC'

                var n = new Date(text);

                $(this).html(n.toDateString() + " " + n.toLocaleTimeString());

                $(this).attr("title", "Converted from UTC " + text);
            }
            catch (ex) {
                console.warn("Error converting time", ex);
            }
        });
    });
</script>