【问题标题】:datetime time zone conversion in .net web service.net Web 服务中的日期时间时区转换
【发布时间】:2009-03-03 19:13:56
【问题描述】:

我有一个 web 服务(实际上是一个启用 silverlight 的 wcf 服务,但出于所有意图和目的,它是一个 web 服务),它的方法采用 datetime 参数。该方法从客户端调用,该客户端可能位于不同的时区。托管 Web 服务的服务采用太平洋标准时间,并且 Web 服务似乎正在将日期时间值转换为服务器时区。 Web 服务的目的是将日期时间值与数据库中的值进行比较,但数据库中的值是基于客户端时区的,因此由于转换,比较不起作用。

有什么方法可以关闭转换?

【问题讨论】:

    标签: .net web-services datetime timezone


    【解决方案1】:

    并且似乎 Web 服务正在将日期时间值转换为服务器时区。

    我正在尝试确保我的设置正确:您的 Web 服务方法采用 DateTime 类型的参数(如 System.DateTime)并正在转换传递的参数?

    DateTime 对象不携带隐式时区,因此 Web 服务推断本地时间的任何决定都是逻辑缺陷(至少不支持时区标准。)

    如果您可以提供您的服务器和客户端代码 sn-ps,它将使该场景更易于诊断。

    更新:不确定这种情况是否准确,因此请澄清:

    • 客户端提交请求,其 DateTime 值为 '12:00:00 00:00:00 PM CST'
    • PST 中的服务器在“10:00:00 00:00:00 PM PST”接收/解释请求

    如果是这种情况,您能否将所有数据转换为 UTC 时间?如果您正在执行查询查找,这意味着将存储的数据也转换为 UTC。

    【讨论】:

    • 当日期时间被序列化时,它的格式包括时区信息。
    • 抱歉,误解了这个问题——听起来好像是服务在转换值,而不是 WCF 内部。
    • 我将不得不这样做。将数据库中的日期时间存储为 utc,并在调用 Web 服务之前将客户端值转换为 utc。
    • 由于我们只使用 UTC,我从未在我们的服务的任何方法参数中看到 DateTime 转换。乐意效劳;我也学到了一些东西。 :-)
    【解决方案2】:

    DateTime 实例(结构)不携带 TimeZone 信息并不完全正确。从 .NET ... 3.0 开始,每个 DateTime 结构都有一个 DateTimeKind 属性?我不知道版本。 “种类”是 UTC、本地或未指定。因此,虽然它本身不是 TimeZone,但它表明时间要么以本地时区表示,要么以通用时区表示。查看文档以获取更多信息。

    要回答最初的问题 - 将每个人都转换为一个标准时区。 UTC 工作得很好,而且很容易,因为 BCL 内置了一些方法,但你选择什么时区并不重要。只要让每个人都同意一个标准。

    您可以做的另一件事是将时间值作为“TotalSeconds”值传输,因为......过去的某个特定时间。如 1970 年 1 月 1 日(unix time_t)或 1601 年 1 月 1 日(Windows FILETIME)。但这种方法隐含的是,所有合作方都同意这个时间点是UTC。所以从一开始的一百万秒(“纪元”)指的是同一时刻,无论我是在埃尔帕索、纳舒厄、东京还是伦敦。

    【讨论】:

      【解决方案3】:

      看看这个问题,它有一些关于你想要什么的讨论。

      看起来最简单的方法是在 web 方法中也传递客户端时区,或者只是将整个时间作为字符串而不是 DateTime 传递

      【讨论】:

        猜你喜欢
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 2013-12-23
        • 2018-07-08
        • 1970-01-01
        • 2012-05-28
        • 1970-01-01
        相关资源
        最近更新 更多