ASP.NET MVC конвертирует DateTime в UTC для отправки в API - PullRequest
0 голосов
/ 07 сентября 2018

Мне нужно отправить дату начала и дату окончания в API в формате UTC, я попробовал следующее:

DateTime startDate = Convert.ToDateTime(start + "T00:00:00Z").ToUniversalTime();
DateTime endDate = Convert.ToDateTime(end + "T23:59:59Z").ToUniversalTime();

Но похоже, что они не конвертируются в UTC, как правильно взять startDate и endDate и преобразовать их в UTC?

начало - это строка, 2018-08-31, а дата окончания - также строка, 2018-08-31. Я добавил время в приведенном выше коде, чтобы охватить полную дату.

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Если вы хотите, чтобы endDate представлял последний возможный момент на данную дату в UTC:

DateTime startDate = DateTime.ParseExact(start, "yyyy-MM-dd", CultureInfo.InvariantCulture,
                        DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);

DateTime endDate = DateTime.ParseExact(end, "yyyy-MM-dd", CultureInfo.InvariantCulture,
                        DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)
                        .AddDays(1).AddTicks(-1);

Несколько других вещей:

  • ToUniversalTime конвертируется в UTC из местного часового пояса компьютера (если не .Kind == DateTimeKind.Utc). Как правило, этого следует избегать, если местный часовой пояс компьютера не соответствует вашей ситуации.

  • В приведенном выше коде вам нужно как AssumeUniversal, чтобы указать, что входная дата должна интерпретироваться как UTC, так и AdjustToUniversal, чтобы указать, что вы хотите, чтобы выходное значение сохранялось в терминах UTC. а не местный часовой пояс компьютера.

  • UTC не является «форматом». Объединенные строки даты и времени будут в расширенном формате ISO 8601 (также совместим с RFC 3339).

  • Как правило, старайтесь не использовать Convert.ToDateTime. Это эквивалентно DateTime.Parse с CultureInfo.CurrentCulture и без DateTimeStyles. Это может работать для некоторых сценариев, но обычно лучше быть более конкретным.

  • .AddDays(1).AddTicks(-1) здесь, чтобы привести вас к последнему представительному тику в этот день. Это позволяет проводить инклюзивное сравнение между началом и концом, однако имеет недостаток, заключающийся в невозможности вычесть два значения и получить целые 24 часа. Таким образом, обычно лучше просто отследить 00:00 одного дня до 00:00 следующего дня, а затем использовать исключительное сравнение на дату окончания. (Только дата начала должна сравниваться включительно.)

    Другими словами, вместо:

    2018-08-31T00:00:00.0000000Z <= someValueToTest <= 2018-08-31T23:59:59.9999999Z
    

    Сделайте это:

    2018-08-31T00:00:00.0000000Z <= someValueToTest < 2018-09-01T00:00:00.0000000Z
    
0 голосов
/ 07 сентября 2018

Сначала установите пакет ниже из диспетчера пакетов NuGet и сослался на него в вашем проекте:

Install-Package Newtonsoft.Json

Теперь вы можете легко использовать JsonConvert.SerializeObject(object value) метод для сериализации любых объектов в Json.

Для преобразования DateTime в UTC используйте метод TimeZoneInfo.ConvertTimeToUtc(DateTime dateTime).

В вашем случае:

DateTime date = DateTime.Parse("2018-08-31");
DateTime dateTimeToUtc = TimeZoneInfo.ConvertTimeToUtc(date);
string dateInJson = JsonConvert.SerializeObject(dateTimeToUtc);

переменная dateInJson будет иметь значение, подобное 2018-08-30T19:30:00Z.

0 голосов
/ 07 сентября 2018

Снимите Z

        string start = "2018-08-31";
        string end = "2018-08-31";

        DateTime startDate = Convert.ToDateTime(start + "T00:00:00");
        DateTime endDate = Convert.ToDateTime(end + "T23:59:59");

        Console.WriteLine(startDate);                   // 8/31/2018 12:00:00 (Local)
        Console.WriteLine(startDate.ToUniversalTime()); // 8/31/2018 5:00:00 (UTC)
        Console.WriteLine(endDate);                     // 8/31/2018 11:59:59 (Local)
        Console.WriteLine(endDate.ToUniversalTime());   // 9/1/2018 4:59:59 (UTC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...