提问者:小点点

C#使用specifyKind时出现时区问题


我在使用SpecifyKind时遇到问题。我发现,如果我将字符串(“O”)应用于DateTime.Now或new DateTime(),则会使spantime不同。我不知道这是怎么可能的。我尝试将这些日期时间保存为数据库中的Utc,但由于跨度不同,时间将不正确。
我就是这样做的:

var now = DateTime.Now;
                    var nowst = now.ToString("O", CultureInfo.InvariantCulture);
 var dattt = new DateTime(2020,07,20,09,44,09, DateTimeKind.Local);
                var datttst = dattt.ToString("O", CultureInfo.InvariantCulture);

现在:2021-12-08 13:40:35现在:2021-12-08T13:40:35.1159209 01:00日期:2020-07-20 09:44:09日期:2020-07-20T09:44:09.0000000 02:00”


共1个答案

匿名用户

当保存到数据库时,您希望保存UTC日期时间,以避免您已经提到的时间差,但是在C#中更好的方法是使用UtcNow,“O”值只是为了获得的ISO-8601表示形式的值。如果您的时间已经在UTC,您将无法将GMT添加到ISO-8601字符串中。

var utcNow = DateTime.UtcNow;
var utcNowO = utcNow.ToString("O", CultureInfo.InvariantCulture);
Console.WriteLine($"DateTime UtcNow: {utcNow} =>ISO-8601 of it: {utcNowO}");

至于为什么你的问题中的值的差异,它是夏令时,如果你选择UtcNow,你可以完全忽略它,并将值保存到数据库。当从数据库中读取时,您可以再次将其转换为本地时间,这将考虑到本地时区的格林尼治标准时间。
至于夏令时-这不能立即考虑,因为这些可以是仲裁决定由政府制定。在以色列——不到一个月前,政府通过了一项决定,将时钟设置为格林尼治标准时间3以适应日光,直到多年前一直是格林尼治标准时间2...你将来执行的代码不会知道这样的决定发生在过去只是几个月的开箱即用。如果您希望您的代码“知道”将来您应该用时间差而不是UTC日期时间来保存本地时间。