Я пытался искать информацию в документации net.core (проблема и т. д.) безрезультатно. Код проще:
[HttpGet()]
[Route("dob")]
public string dobTest()
{
var content = @"""1942-01-01T22:00:00.000Z""";
var settings = new JsonSerializerSettings()
{
//DateFormatHandling = DateFormatHandling.IsoDateFormat,
//DateParseHandling = DateParseHandling.DateTimeOffset,
DateTimeZoneHandling = DateTimeZoneHandling.Local,
//DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
};
var dob = JsonConvert.DeserializeObject<DateTime>(content, settings);
return $"dob: {dob.ToString("yyyy-MM-dd HH:mm:ss.fff")} - {dob.Kind}";
}
если я запускаю этот код на Mac или Linux, результат будет таким:
Дата рождения: 1942-01-02 00:00:00.000 - Местный
если я запускаю этот код в Windows, результат будет таким:
доб: 1942-01-01 23:00:00.000 - местный
Часовой пояс моего MacOs установлен в Риме (UTC +01:00). Часовой пояс Windows установлен в Риме (UTC +01:00).
версия Newtonsoft.Json — 12.0.3. Версия net framework — net core 3.1.
И Linux, и OSX используют базу данных часовых поясов IANA в качестве основного источника информации о часовых поясах, которая имеет правильные исторические данные для часовых поясов в 1942 году в Риме под идентификатором Europe/Rome
. Вы также можете видеть, что UTC+2 является правильным смещением для даты, указанной здесь.
Windows, с другой стороны, не имеет такой истории для этого часового пояса. Эквивалентный идентификатор Windows — W. Europe Standard Time
, отображаемое на английском языке — (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
. Вы можете увидеть данные Windows в реестре в следующем ключе:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\W. Europe Standard Time
Если вы изучите этот ключ с помощью RegEdit, вы заметите, что, в отличие от некоторых других часовых поясов, для этого пояса нет подраздела Dynamic DST
. Это означает, что Windows не знает о каких-либо исторических различиях в правилах перехода на летнее время и, таким образом, каждый год обрабатывает один и тот же набор правил.
У Windows есть исторические данные для некоторых зон, но в целом Microsoft гарантирует историческую точность только с 2010 года в соответствии со своей политикой поддержки DST/TZ.
Таким образом, если в вашем приложении требуется точность исторических часовых поясов, вам следует использовать только часовые пояса IANA. В .NET это можно сделать с помощью провайдера TZDB в библиотеке Noda Time.
сегодня узнал, что
dob: 1922-01-01 23:02
ноdob: 1942-01-01 23:00
ноdob: 1952-01-02 00:00
из-заtz/europe
fили Украины (на Ubuntu 20)