【问题标题】:Handling UTC time within C#?在 C# 中处理 UTC 时间?
【发布时间】:2011-09-16 00:04:32
【问题描述】:

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

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

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

DateTime date = DateTime.Parse(value);

将值提取到DateTimeobject 中。现在,我从这个时间中减去一些任意时间 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 日期。

【问题讨论】:

  • 只是一个不相关的小提示:您可以使用TimeSpan.FromHours(8) 使代码更具可读性。还有FromSeconds、FromMinutes等
  • 嗯?我没有看到你的问题。
  • @SLaks:我尝试添加一个更简洁的问题。

标签: c# sql-server datetime date


【解决方案1】:

您不需要从 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 ...

【讨论】:

    【解决方案2】:

    这并不重要。日期就是日期,无论它位于哪个时区。除非您将其转换为不同的时区,否则 .Net 不知道也不关心它是什么时区。

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

    【讨论】:

      【解决方案3】:

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

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

      在这个 sn-p 中,localDate 将是通用时间输入的本地时间。因此,对于 EDT(美国)来说,应该是上午 7:03:58。 utcDate 将具有 11:03:58,与输入字符串匹配。

      【讨论】:

        【解决方案4】:

        原始日期是 UTC 时间,还是您的本地时间?如果原始时间是本地时间并且您要减去 8 小时以使其成为 UTC,则使用 DateTime.ToUniversalTime()。要另辟蹊径,请使用DateTime.ToLocalTime()。还是我错过了什么?

        【讨论】:

        • 原始日期也是UTC。我的错误,8 小时只是我减去的任意数字,与我尝试将其转换为 UTC 无关。
        • 在这种情况下,您可以随心所欲地使用它。 DateTime 也有添加特定日期部分的方法,例如 DateTime.AddHours()。完整列表在这里:msdn.microsoft.com/en-us/library/…。要减去小时,只需添加一个负数。
        • 在查看您的编辑后,我怀疑您真正要问的是“.NET DateTime 类是否有一些内部概念是否代表 UTC 或其他时区”,在这种情况下答案是不是它没有。
        • 视情况而定。例如,尝试:Console.WriteLine(DateTime.Now.Kind); // 本地 Console.WriteLine(DateTime.UtcNow.Kind); // UTC
        • True-忘记了种类。但这只是 UTC 或本地 - 我认为它不适用于手头的具体问题。不过,如果他使用我的第一个建议,ToUniversalTime 或 ToLocalTime,那会有所不同。
        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-03
          • 1970-01-01
          • 1970-01-01
          • 2010-10-20
          • 2021-03-09
          • 2016-07-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多