Проблема с часовым поясом, поскольку время пользователя и время сервера различаются - PullRequest
2 голосов
/ 03 апреля 2011

По сути, у меня есть веб-приложение silverlight .net, где пользователь выполняет планирование своих задач и т. Д. Поэтому он выбирает время и дату запуска задачи, и он может быть в любой точке мира, а затем в это время. хранится в базе данных, однако сервер, который принимает и выполняет эти запланированные задачи, будет где-то еще (скажем, мальта и т. д.), поэтому часовой пояс будет другим. Каков наилучший возможный способ, не спрашивая пользователя о часовом поясе, преобразовывать время пользователей в время серверов и время серверов в время пользователя наоборот для обработки задач?

Спасибо заранее, Jon

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

Я думаю, что вы хотите сохранить все на сервере во время UTC, а затем преобразовать его обратно во время пользователя, когда вы собираетесь отображать его в клиентском приложении.Когда пользователь планирует задачу, преобразуйте это время в UTC на клиенте и передайте его на сервер.Затем сервер всегда передает обратно время UTC клиенту.

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

0 голосов
/ 03 апреля 2011

> Как лучше всего, не спрашивая пользователя о часовом поясе

Тогда вы должны будете предположить, что часовой пояс ОС клиента установлен правильно (часто это не так.case) и используйте этот часовой пояс для преобразования в / из ваших серверов времени , которое должно быть в UTC

Вот несколько методов расширения, которые позволяют вам сделать это.

Любые даты, отправленные клиенту, должны вызывать ToDisplayTime() перед отображением в пользовательском интерфейсе клиента.

Аналогично, перед тем, как клиент отправляет дату на сервер, он должен вызвать FromDisplayTime() для преобразованияэто к UTC. таким образом, сервер отправляет и получает время только в UTC

/// <summary>
    /// Converts the specified DateTime (which should be the UTC time) into the users timezone.
    /// </summary>
    /// <param name="utcDateTime"></param>
    /// <returns></returns>
    public static DateTime ToDisplayTime(this DateTime utcDateTime)
    {
        var result = TimeZoneInfo.ConvertTime(utcDateTime, TimeZoneInfo.Local);
        return result;
    }

    /// <summary>
    /// Converts the specified DateTime from local time to UTC
    /// </summary>
    /// <param name="locatDateTime"></param>
    /// <returns></returns>
    public static DateTime FromDisplayTime(this DateTime locatDateTime)
    {
        var result = TimeZoneInfo.ConvertTime(locatDateTime, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById("UTC"));
        return result;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...