关于wcf:.NET 3.5中DateTime序列化的最佳做法

关于wcf:.NET 3.5中DateTime序列化的最佳做法

Best practices for DateTime serialization in .NET 3.5

大约4年前,我按照这篇MSDN文章介绍了DateTime使用的最佳实践,该最佳实践是在.Net 1.1和ASMX Web服务(以SQL 2000服务器为后端)上构建.Net客户端的。 我仍然记得DateTime遇到的序列化问题,以及它在不同时区中对服务器所做的测试工作。

我的问题是:是否为WCF和SQL Server 2008等某些新技术提供了类似的最佳实践文档,尤其是添加了新的datetime类型来存储时区感知信息。

这是环境:

  • 太平洋时间的SQL Server 2008。
  • Web Services层位于其他时区。
  • 客户端可能在不同时区使用.Net 2.0或.Net 3.5。 如果这很容易,我们可以强迫所有人升级到.Net 3.5。:)
  • 有关在每一层中使用的数据类型的任何好的建议/最佳实践?


    我认为最好的方法是始终将对象作为UTC传递,并在客户端上转换为本地时间。这样,所有客户都有一个共同的参考点。

    若要转换为UTC,请在DateTime对象上调用ToUniversalTime。然后,在客户端上,调用ToLocalTime以获取其当前时区。


    一个大问题是WCF序列化不支持xs:Date。这是一个很大的问题,好像您只需要一个日期,就不应该让您担心时区。以下连接问题讨论了一些问题:http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215

    如果要明确表示一个时间点,即不仅仅是日期部分,则如果客户端和服务器上都装有.NET 3.5,则可以使用DateTimeOffset类。或为了实现互操作性,请始终将日期/时间值作为UTC传递。


    UTC / GMT在分布式环境中将保持一致。

    重要的一件事是在使用数据库中的值填充DateTime属性后,指定datetimeKind。

    1
    dateTimeValueUtcKind = DateTime.SpecifyKind(dateTimeValue, DateTimeKind.Utc);

    参见MSDN


    只要您的Web服务层和客户端层使用.NET DateTime类型,它就应该正确地序列化和反序列化为带有时区信息的SOAP标准本地日期/时间,例如:

    2008-09-15T13:14:36.9502109-05:00

    如果绝对可以肯定地知道时区本身(即上面的时间可能是东部标准时间或中部夏令时),则需要创建自己的数据类型以将这些片段公开为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    [Serializable]
    public sealed class MyDateTime
    {
        public MyDateTime()
        {
            this.Now = DateTime.Now;
            this.IsDaylightSavingTime = this.Now.IsDaylightSavingTime();
            this.TimeZone = this.IsDaylightSavingTime
                ? System.TimeZone.CurrentTimeZone.DaylightName
                : System.TimeZone.CurrentTimeZone.StandardName;
        }

        public DateTime Now
        {
            get;

            set;
        }

        public string TimeZone
        {
            get;

            set;
        }

        public bool IsDaylightSavingTime
        {
            get;

            set;
        }
    }

    那么您的响应将如下所示:

    1
    2
    3
    <Now>2008-09-15T13:34:08.0039447-05:00</Now>
    <TimeZone>Central Daylight Time</TimeZone>
    <IsDaylightSavingTime>true</IsDaylightSavingTime>

    我很幸运,仅保留DateTime数据类型并将其始终存储为GMT。在每一层中,我都会将GMT值调整为该层的本地值。


    推荐阅读

      linux重新服务命令?

      linux重新服务命令?,服务,系统,网络,标准,工作,设备,命令,名称,信息,网络服

      linux服务器基本命令?

      linux服务器基本命令?,地址,系统,设备,网络,工作,标准,信息,电脑,命令,密码,l

      linux服务器下载命令?

      linux服务器下载命令?,服务,密码,系统,档案,工具,网络,公共,百度,地址,认证,l

      linux命令怎么停服务?

      linux命令怎么停服务?,服务,系统,状态,代码,跨行,软件,情况,第一,名称,命令,l

      linux服务端退出命令?

      linux服务端退出命令?,档案,命令,环境,异常,标准,网络,模式,终端,编辑,文件,l

      linux中启动服务命令?

      linux中启动服务命令?,服务,系统,命令,信息,工作,设备,网络,标准,名称,密码,l

      linux命令测试客户端?

      linux命令测试客户端?,地址,系统,网络,工具,工作,分析,环境,命令,下行,资料,l

      linux服务器常用命令?

      linux服务器常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,设备,功能,

      linux筛选服务命令?

      linux筛选服务命令?,服务,系统,状态,软件,环境,主体,技术,号码,发行,名称,查

      linux服务器保存命令?

      linux服务器保存命令?,时间,状态,档案,电脑,命令,信息,位置,编辑,文件,模式,L

      linux服务器扫盘命令?

      linux服务器扫盘命令?,地址,工作,命令,目录,数据,单位,名称,系统,管理,信息,L

      linux命令切换服务器?

      linux命令切换服务器?,地址,名称,系统,环境,实时,命令,服务器,脚本,路径,版

      linux服务器搭建命令?

      linux服务器搭建命令?,系统,服务,软件,地址,平台,在线,密码,工具,环境,百度,l

      服务器重启命令linux?

      服务器重启命令linux?,工作,标准,设备,服务,系统,名称,命令,百度,网络,密码,

      linux服务端常用命令?

      linux服务端常用命令?,工作,地址,系统,网络,基础,命令,标准,工具,信息,管理,l

      linux禁用服务命令行?

      linux禁用服务命令行?,服务,系统,软件,管理,工具,信息,状态,平台,连续,技术,l

      linux停服务常用命令?

      linux停服务常用命令?,地址,工作,系统,命令,服务,信息,标准,管理,代码,进程,l

      linux服务器删除命令?

      linux服务器删除命令?,系统,服务,管理,情况,命令,工作,互动,地址,软件,较大,l

      linux开启服务命令?

      linux开启服务命令?,服务,标准,设备,工作,网络,系统,密码,命令,服务器,终端,

      linux服务器负荷命令?

      linux服务器负荷命令?,信息,电脑,中科,环境,工具,系统,平均,检测,情况,状态,l