преобразование даты из SQL Server в C #, а затем в javascript дает разные результаты на веб-сервере США и Лондона - PullRequest
1 голос
/ 27 августа 2010

У меня есть приложение календаря asp.net mvc (с использованием jquery ui datepicker), и я сталкиваюсь со странной ситуацией, когда при тестировании на американском веб-сервере я вижу определенную дату и когда я тестирую на лондонском веб-сервере, я вижудругая дата (предыдущая дата)

Вот подробности:

Я сохраняю дату на сервере sql как:

 2010-09-16 00:00:00.000

Затем загружаю ее вC # DateTime объект.

Мне нужно передать это как часть объекта json моему клиентскому javascript, поэтому мне было предложено следующее решение:

jsonobject.Date = UnixTicks(a.Date),

, где UnixTicks :

private static double UnixTicks(DateTime dt)
    {
        DateTime d1 = new DateTime(1970, 1, 1);
        DateTime d2 = dt.ToUniversalTime();
        TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
        return ts.TotalMilliseconds;
    }

Затем я конвертирую ее в дату javascript, используя следующий код на стороне клиента:

var d = new Date(jsonobject.Date);

Кто-нибудь знает, почему, если бы я получил сервер США или сервер в Лондоне, я бы получилвернуться на другую дату.Сначала я думал, что это

 DateTime d2 = dt.ToUniversalTime();

, но я изменил это на:

 DateTime d2 = dt;

и все еще видел ту же проблему.(на лондонском веб-сервере дата будет отображаться за 1 день до веб-сервера в США)

есть предложения?

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

Если вы храните местное время в базе данных вместо UTC, вы можете получить разные даты при обратном преобразовании в местное время.Убедитесь, что ваши даты конвертированы в UTC до того, как вы передадите их в базу данных.Если вы хотите, чтобы все всегда видели одну и ту же дату независимо от того, где они находятся, всегда возвращайте дату UTC - не переводите обратно в местное время.

0 голосов
/ 27 августа 2010

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

SELECT
    CONVERT(varchar(10),YourDatetimeColumn,111) AS StringDate1  --YYYY/MM/DD
   ,CONVERT(varchar(10),YourDatetimeColumn,121) AS StringDate2  --YYYY-MM-DD
    FROM ...

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

0 голосов
/ 27 августа 2010

Это определенно проблема локализации.Вам нужно хранить ваш DateTime в том же часовом поясе и учетной записи для другого форматирования даты.Например, 1 сентября 2010 года в США отформатировано «01.09.2010», а в Великобритании - «1/9/2010».Если вы смотрите на это как на свидание в США, вы увидите 9 января 2010 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...