ServiceStack.Text выводит смещение UTC

Недавно я обновил ServiceStack.Text для своего проекта с 3.9.23 до последней стабильной версии.

У меня есть некоторые модульные тесты, гарантирующие, что формат даты, который мы выводим, не изменяется. Теперь они терпят неудачу после обновления. Тест выглядит так:

[Test]
[TestCase(2012, 06, 22, 03, 26, 23, 837, "\"\\/Date(1340328383837+0200)\\/\"")] // Daylight savings time test in DK (+0200)
[TestCase(1997, 10, 30, 11, 23, 49, 060, "\"\\/Date(878207029060+0100)\\/\"")]
[TestCase(2050, 01, 14, 00, 00, 00, 000, "\"\\/Date(2525727600000+0100)\\/\"")] 
public void SerializeDate_ReturnsExpectedOutput(int year, int month, int day, int hour, int minute, int second, int ms, string expected)
{
    var dt = new DateTime(year, month, day, hour, minute, second, ms).ToUniversalTime();
    dt = TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"));

    string serialized = ServiceStack.Text.JsonSerializer.SerializeToString(dt);

    Assert.AreEqual(expected, serialized, "DateTime Serialization failure, got {0} but expected {1} for DateTime = {2}",
        serialized, expected, dt);
}

Тест не пройден, потому что ServiceStack.Text теперь выводит смещение UTC как ноль, а это не то, что я хочу, поэтому я получаю:

  String lengths are both 30. Strings differ at index 21.
  Expected: ""\\/Date(1340328383837+0200)\\/""
  But was:  ""\\/Date(1340328383837-0000)\\/""
  ---------------------------------^

Как я могу настроить ServiceStack.Text для использования старого поведения?

1 ответ

Решение

Окружение:

ServiceStack.Text.JsConfig.DateHandler = ServiceStack.Text.JsonDateHandler.DCJSCompatible;

Решает проблему для меня, которая была в основном то, что мне нужно было с DateTimes DateTimeKind.Unspecified лечиться так, как будто они по местному времени. Я посмотрел на источник ServiceStack.Text, и этот обработчик делает именно это. Просто помните, что обработчик отбрасывает смещение UTC и обрабатывает время как местное время при разборе строки как ввод DateTime. (К счастью, это также работает для моего приложения).

Другие вопросы по тегам