sql server-在C#中处理UTC时间

本文关键字:处理 UTC 时间 server- sql | 更新日期: 2023-09-27 17:59:27

我不是C#内部的专家,所以这个问题实际上可能非常愚蠢。如果是,请纠正我。我有一些数据(UTC格式)是从SQL服务器上提取的。

2011-03-26 11:03:58.000
2011-03-26 11:04:25.000
...

我在C#中解析这个文件,并使用以下内容:

DateTime date = DateTime.Parse(value);

以将该值获取到CCD_ 1对象中。现在,我从这个时间中减去一些任意的时间6小时,如下所示:

date = date.Subtract(new TimeSpan(6, 0, 0));

最后,我将这个写回另一个文件,如下所示:

output.WriteLine(date.ToString("yyyy-MM-dd HH:mm:ss.fff"));

因为我没有进行任何隐式转换,所以输出也是UTC。我的问题是,在解析的日期上允许这种时间的加法/减法吗?还是在能够操作时间之前,我需要进行一些UTC到C#的特定转换?我很难理解这件事。有人能澄清一下吗?

编辑:试着写一个简明扼要的问题原始日期以UTC为单位。我想加/减一些时间,然后用UTC写回来。我想知道我是否可以直接操作解析的日期,或者我需要进行一些转换,即明确告诉C#日期是UTC格式,然后操作它,然后再次告诉它写回UTC日期。

sql server-在C#中处理UTC时间

这其实并不重要。日期就是一个日期,不管它在哪个时区。除非你把它转换成不同的时区,.Net不知道也不在乎它是哪个时区。

如果您愿意,可以拨打DateTime.SpecifyKind(value, DateTimeKind.Utc)

您不需要从SQL Server解析日期时间。ADO.Net将为结果中的datetime类型列返回一个SqlDateTime对象。ORM库(LinqToSQL、Entity Framework等)也完全能够将datetime类型的列映射到DateTime属性。如果你发现自己在解析一个字符串,那你就做错了(更不用说SET DATEFORMAT的所有含义了…)

请注意,您描述的操作可以直接在服务器上执行,例如,在UTC日期时间字段中添加一个小时,并将其保存为UTC日期时间:

UPDATE table SET column = DATEADD(hour, 1, column) WHERE ...

原始日期是UTC时间还是当地时间?如果原始时间是本地时间,而您要减去8小时使其成为UTC,那么请使用DateTime.ToUniversalTime()。如果要使用其他方法,请使用DateTime.ToLocalTime(),或者我遗漏了什么?

使用DateTimeOffset

由于输入字符串是通用的,您可以使用接受DateTimeStyleDateTime.Parse重载来指示这一点。

string utcDateString = "2011-03-26 11:03:58.000";
DateTime localDate = DateTime.Parse(utcDateString, 
                          CultureInfo.CurrentCulture, 
                          DateTimeStyles.AssumeUniversal);
DateTime utcDate = localDate.ToUniversalTime();

在这个片段中,DateTime0将是通用时间输入的本地时间。因此,对于EDT(US),它将是上午7:03:58。utcDate将具有与输入字符串匹配的11:03:58