Есть ли у метода C # DateTime.ToString () проблемы с часовыми поясами? - PullRequest
0 голосов
/ 06 февраля 2019

Мой сервер находится в часовом поясе UTC, а моя локальная система находится в другом часовом поясе.У меня есть объект datetime, указывающий на первую секунду определенной даты, скажем, 7 января 2018 года, то есть 07-01-2019 00:00:00.Если я вызываю метод toString ("dd MMM yyyy") для этого объекта и возвращаю его в мою локальную систему и отображаю его, я вижу, что дата выключена на день, показывая 6 января 2019 года. Не могли бы вы объяснить, почему это может бытьтак?

РЕДАКТИРОВАТЬ: Первоначально я хотел задать вопрос, чтобы знать, если метод dateTime.ToString () имеет какие-либо заметные проблемы.Может ли кто-нибудь объяснить мне, почему это так?

Мое тестирование проблемы показало, что ошибка воспроизводима только тогда, когда сервер, на котором размещена веб-страница, и клиент, взаимодействующий с веб-страницей, находятся в разных часовых поясах.Мой клиент в IST, а сервер в UTC.Предположим, я выбрал 29 января 2019 г. и 7 февраля 2019 г. в качестве даты начала и окончания соответственно.

Клиентская сторона отправляет в API в качестве параметров следующие параметры.При переключении на разные часовые пояса я заметил, что отправленные параметры находятся только в UTC.

fromDate: "2019-01-28T18:30:00.000Z"
toDate: "2019-02-06T18:30:00.000Z"

API принимает их и выполняет следующие действия:

{
    DateTime utcStart = DateTime.SpecifyKind(Convert.ToDateTime(fromDate), 
    DateTimeKind.Unspecified);
    DateTime utcEnd = DateTime.SpecifyKind(Convert.ToDateTime(toDate), 
    DateTimeKind.Unspecified);
    dummyMethod(utcStart,utcEnd,true, null, out strDuration);
}

dummyMethod(DateTime? fromDate, DateTime? toDate, Boolean convertToUTC, int? timeZoneKey, out string displayString)
{
    DateTime centerStartDate = GetCurrentTime(timeZoneKey).Date;
    DateTime centerEndDate = GetCurrentTime(timeZoneKey).Date;

    if (fromDate.HasValue)
        centerStartDate = fromDate.Value.Date;
    if (toDate.HasValue)
        centerEndDate = toDate.Value.Date;

    displayString = centerStartDate.ToString("dd MMM yyyy") + " - " + centerEndDate.ToString("dd MMM yyyy");
}

displayString напрямую возвращается через JSON, а displayString - то, где кажется, что что-то идет не так.

TIA

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Это связано с тем, что DateTime фактически сохраняет тики с 00:00:00 01-01-0001 нашей эры. От MSDN:

Конкретной датой является количество тиков с 12:00 полуночи января1, 0001 н.э. (CE) в календаре GregorianCalendar.

Из-за этого объект DateTime будет иметь UtcTime с точки зрения тиков, а когда вы получите его в локальной системе, вы получитескорректированный DateTime при печати DateTime.ToString();

Это можно исправить с помощью UtcTime.

DateTime.UtcNow;

0 голосов
/ 06 февраля 2019

Если вы хотите получить дату вашего сервера / время Utc, вам нужно позвонить:

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