在C#中处理UTC时间?

时间:2011-06-16 01:06:30

标签: c# sql-server datetime date

我不是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日期。

5 个答案:

答案 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。 utcDate11:03:58与输入字符串匹配。