我不是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日期。
这其实并不重要。日期就是一个日期,不管它在哪个时区。除非你把它转换成不同的时区,.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
由于输入字符串是通用的,您可以使用接受DateTimeStyle
的DateTime.Parse
重载来指示这一点。
string utcDateString = "2011-03-26 11:03:58.000";
DateTime localDate = DateTime.Parse(utcDateString,
CultureInfo.CurrentCulture,
DateTimeStyles.AssumeUniversal);
DateTime utcDate = localDate.ToUniversalTime();
在这个片段中,DateTime
0将是通用时间输入的本地时间。因此,对于EDT(US),它将是上午7:03:58。utcDate
将具有与输入字符串匹配的11:03:58
。