我不是C#内部的专家,所以这个问题实际上可能是彻头彻尾的愚蠢。如果是这样,请纠正我。我有一些从SQL服务器中取出的数据(以UTC格式)。
2011-03-26 11:03:58.000
2011-03-26 11:04:25.000
...
我在C#中解析这个文件,并使用以下内容:
DateTime date = DateTime.Parse(value);
将值提取到DateTime
对象中。现在,我从这个时间开始减去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日期。
答案 0 :(得分:4)
这并不重要。日期是一个日期,无论它处于什么时区。除非您将其转换为其他时区,否则.Net不知道或关心它的时区。
如果您愿意,可以致电DateTime.SpecifyKind(value, DateTimeKind.Utc)
。
答案 1 :(得分:3)
您无需从SQL Server解析日期时间。 ADO.Net将在结果中为SqlDateTime
类型列返回datetime
个对象。 ORM库(LinqToSQL,Entity Framework等)也完全能够将datetime
类型列映射到DateTime
属性。如果您发现自己正在解析字符串,那么您做错了(更不用说SET DATEFORMAT
的所有含义......)
作为注释,您描述的操作可以直接在服务器上执行,例如。将一小时添加到UTC日期时间字段并将其保存为UTC日期时间:
UPDATE table SET column = DATEADD(hour, 1, column) WHERE ...
答案 2 :(得分:2)
原始日期是UTC时间还是您当地时间?如果原始时间是本地时间,并且您要减去8小时使其成为UTC,则使用DateTime.ToUniversalTime()。换句话说,使用DateTime.ToLocalTime()。或者我错过了什么?
答案 3 :(得分:1)
答案 4 :(得分:1)
如果输入字符串是通用的,您可以使用DateTime.Parse
的重载来接受DateTimeStyle
来指示这一点。
string utcDateString = "2011-03-26 11:03:58.000";
DateTime localDate = DateTime.Parse(utcDateString,
CultureInfo.CurrentCulture,
DateTimeStyles.AssumeUniversal);
DateTime utcDate = localDate.ToUniversalTime();
在此代码段中,localDate
将是通用时间输入的本地时间。所以对于EDT(美国)来说,它将是7:03:58 AM。 utcDate
将11:03:58
与输入字符串匹配。