【问题标题】:confusion around DateTimeOffset and TimeZones围绕 DateTimeOffset 和 TimeZones 的混淆
【发布时间】:2012-11-09 00:44:40
【问题描述】:

我目前正在开发一个将在多个不同国家和时区使用的 .net 应用程序。后端数据库是sql server。

我一直在研究 datetime、datetime2 和 datetimeoffset 数据类型,我有点困惑。

一些例子可能有助于我的困惑。假设我有一个表,其中包含产品数据以及其可用性的开始和结束日期。因此,对于开始日期和结束日期,数据将保存为 utc 日期并包含时区。

如果我查询数据库并想省略不在开始日期和结束日期之间的记录,并且会执行以下操作:

select * from products where stardate <= getutcdate() and enddate >= getutcdate;

但这无效,因为 UTC 日期可能无法反映所需数据所在国家/地区的时间,即。不应用时间偏移。那么有什么想法可以解决这个问题吗?

我的下一个问题是,当该国家/地区的日光时间发生变化时,偏移量不会有所不同吗? IE。由于偏移值不正确,数据是否会变得陈旧。

在我的应用程序中向上移动层,并进入我的 .net 代码。当我从数据库中检索数据时,我创建了一个包含结束日期/开始日期的 DateTimeOffset 变量。如果我想在我的 sql 中编写一些类似的代码来检查开始和结束日期,如果我使用 DateTime.UtcNow,我会不会遇到同样的问题?

任何有助于解决我的困惑的帮助都会很棒。

【问题讨论】:

  • 如果这是产品可用性的开始和结束日期,时间实际上是否相关,或者您只需要存储可用性开始/结束的日期?跨度>
  • 是的,它基于时区。因此,虽然它可能在国家/地区可用,但可能在几个小时内无法在其他国家/地区使用。

标签: c# sql datetime timezone datetimeoffset


【解决方案1】:

UTC 日期与时区和夏令时无关,因此 sql server 上的所有计算都应仅在 UTC 时间中执行。时区信息(区域设置)存储在本地 pc 上,并在从 utc 转换为本地时应用日期时间类。对于网页,日期作为 utc 字符串传入并转换为本地时间 通过日期对象(tolocaltime)时间应该在发送到sql server之前由网页或应用程序转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2011-04-01
    • 2016-08-12
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多