【问题标题】:C# UTC DateTime query in WCF/.NETWCF/.NET 中的 C# UTC DateTime 查询
【发布时间】:2012-04-10 08:04:24
【问题描述】:

这是一个非常简单的(希望如此)问题。我是在 .NET 中使用 DateTime 转换的新手。

我有一个具有 DateTime 属性的 WCF 服务 - 称之为 BookingDate。

有人以以下格式将其传递给我的 WCF 服务:

<a:BookingDate>2012-03-26T17:03:00-04:00</a:BookingDate>

它所在的服务器设置为 UTC 时区(里斯本、伦敦、都柏林)。

当我将相应的值存储在数据库中时,它将值设置为:

2012-03-26 22:03

我假设,我错误地认为 .NET 框架(作为 WCF 序列化/反序列化过程的一部分)会为我将其弹出到 UTC 的 .Net 日期时间(因为如上所述有 4 小时的负偏移量)

我期待:2012-03-26 21:03

我的问题是:我需要打电话吗:

var date = fromClientWCFService.BookingDate.ToUniversalTime();

为了得到我期待的 21:03 时间?

如果没有,是否有 WCF 设置告诉我的服务将 DateTimes 转换为 UTC,而不是服务器时区?

提前致谢

标记

编辑:

从 1 个答案中,我可以看到可以使用 DateTimeOffset。在此之后,以下工作:var offset = DateTimeOffset.Parse("2012-03-26T17:03:00-0400"); 返回结果:2012-03-26 21:03

【问题讨论】:

标签: c# .net datetime utc


【解决方案1】:

如果您服务器的时区是里斯本/伦敦/都柏林时间,则它不是 UTC。您要么想要更改服务器的时区,要么在数据库中更新时以 UTC 格式表示日期/时间值。

【讨论】:

  • 这是否意味着 WCF 服务会将该日期时间转换为本地时间(例如里斯本/伦敦/爱尔兰)?
  • 确实没有进行“转换”。您的 DateTime 有一个特定的值,它基于它接收到的数据。不幸的是,如果没有指定日期,它也喜欢假设日期是当地时间。因此,由于数据库中的日期时间没有附加区域设置信息,.NET 决定它是本地时间,而不是通用时间。将您的值表示为进入数据库的 UTC(使用 .ToUniversalTime),并使用 UTC 的 DateTimeKind 来构造它。这应该会给你你所寻求的一致性。
【解决方案2】:

您应该使用DateTimeOffset structure,而不是使用DateTime structure

DateTimeOffset 结构捕获指定时间的偏移量(默认情况下它不是 UTC,它由 您的 应用程序的范围定义,但最常见的偏移量来自 UTC)以及日期/时间信息,并且该信息将通过 WCF 调用(以及数据库,假设它支持该类型。在这种情况下,SQL Server 从 2008 年开始具有datetimeoffset data type)。

事实上,using DateTimeOffset is the preferred methods of dealing with date/time data in almost all situations。上一个链接的注释:

DateTimeOffset 值的这些用途比那些用途更常见 对于日期时间值。因此,应考虑 DateTimeOffset 应用程序开发的默认日期和时间类型。

【讨论】:

  • 感谢您的回答(尤其是这么快)。你能证实我上面的发现吗?如 - 我想了解我是否在正确的路线上,我是否想以这种方式实现它?
  • 另外,不幸的是我只能存储日期时间 - sql server 2005 shop... :(
  • @harrisonmeister 查看我在这个问题上发布的骗子的链接。
  • 嗨@casperOne,谢谢-看起来我走对了。很高兴我不会完全发疯!
猜你喜欢
  • 2010-10-17
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多