Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在服务器中保留.NET DateTime值,如在客户端中分配的那样_.net_Wpf_Wcf_Datetime_Timezone - Fatal编程技术网

在服务器中保留.NET DateTime值,如在客户端中分配的那样

在服务器中保留.NET DateTime值,如在客户端中分配的那样,.net,wpf,wcf,datetime,timezone,.net,Wpf,Wcf,Datetime,Timezone,在我的WPF.NET客户端应用程序中,我为DateTime变量分配了当前时间值: class MyClass { public DateTime CreatedDate {get; set;} } MyClass myClass = new MyClass(); myClass.CreatedDate = DateTime.Now; 分配后,我将对象发送到位于欧洲UTC+1的WCF服务,该服务将对象保存在数据库中。如果客户端和服务位于同一时区,则不存在任何问题。但是,如果我更改时区,例如

在我的WPF.NET客户端应用程序中,我为DateTime变量分配了当前时间值:

class MyClass
{
  public DateTime CreatedDate {get; set;}
}

MyClass myClass = new MyClass();
myClass.CreatedDate = DateTime.Now;
分配后,我将对象发送到位于欧洲UTC+1的WCF服务,该服务将对象保存在数据库中。如果客户端和服务位于同一时区,则不存在任何问题。但是,如果我更改时区,例如,我的客户端位于UTC-6,服务位于UCT+1,则服务将读取CreatedDate值,因为它是DateTime。现在,在服务上,使用UCT+1,而不是客户端上分配的UCT-6。如果将客户端UTC-6上的CreatedDate设置为2014年10月31日20:00,则该服务将于2014年11月1日01:00存储为UTC+1,这将影响我的系统上的某些进程

这不是我想要的行为,我希望服务始终存储客户端提交的日期

我可以访问服务器和客户端的代码,我尝试设置何时将CreatedDate分配为:


没有运气。我能想到的唯一解决方案是使用字符串而不是DateTime,但这意味着代码中有很多更改。有人知道如何忽略时区设置吗

您有几个不同的选择:

将所有内容保留为DateTime,但使用UTC值而不是本地值。这意味着使用获取当前时间

在客户端上,您可以使用生成显示值,以将值从UTC转换为运行客户端代码的计算机的本地时区

切换到。这确保了在将值从客户端传输到服务器时,您保留了时区偏移量—它告诉您特定时间戳离UTC有多远

您可以使用或获取当前时间。后者的优点是保留客户理解的当地时间。如果您计划根据本地日期/时间对数据进行任何汇总分析,则需要此信息。记住,今天对地球上的每个人来说都不一样

如果您有另一种方法来通信客户端的时区,或者如果您已经从外部信息知道了这一点,那么您可以传输DateTime或DateTimeOffset,然后使用该类在服务器上进行转换

不过,有一个问题。如果在回退转换过程中传输的本地日期时间处于模糊期,则可能会导致转换错误。使用UTC或DateTimeOffset可以避免此问题


另请参见和。

您有几个不同的选项:

将所有内容保留为DateTime,但使用UTC值而不是本地值。这意味着使用获取当前时间

在客户端上,您可以使用生成显示值,以将值从UTC转换为运行客户端代码的计算机的本地时区

切换到。这确保了在将值从客户端传输到服务器时,您保留了时区偏移量—它告诉您特定时间戳离UTC有多远

您可以使用或获取当前时间。后者的优点是保留客户理解的当地时间。如果您计划根据本地日期/时间对数据进行任何汇总分析,则需要此信息。记住,今天对地球上的每个人来说都不一样

如果您有另一种方法来通信客户端的时区,或者如果您已经从外部信息知道了这一点,那么您可以传输DateTime或DateTimeOffset,然后使用该类在服务器上进行转换

不过,有一个问题。如果在回退转换过程中传输的本地日期时间处于模糊期,则可能会导致转换错误。使用UTC或DateTimeOffset可以避免此问题


另请参见和。

为什么不在UT中存储DateTime?当您在可视化中转换为字符串时,每个客户机都将看到其本地时间,例如您在StackOverflow上看到的内容。作为保留每个时间戳及其时区的替代方法,您可以使用DateTimeOffset。一般来说……当有更好的类型时,千万不要考虑使用字符串……记录您的服务并声明它应该只发送utc值,并且只返回utc值。让用户界面处理转换。看看这是甜美的音乐,以弥补时间受损的耳朵…谢谢你的提示!然而,我对UTC有点迷茫。如果UTC+6中的客户机在2014年10月31日20:00存储CreatedDate,则UTC中的服务读取的值仍然是2014年11月1日00:00,对吗?在UTC中存储和返回日期意味着您在UTC+0中执行此操作。不涉及时区。这也意味着由客户决定当前时区,并相应地格式化/更改日期时间。也许我搞错了什么。如果我的所有内容都在UTC+0中,这也意味着我的服务将在U中存储CreatedDate
TC+0,但这不是我想要实现的。我希望服务将日期保存在客户机中:为什么不将DateTime存储在UT中?当您在可视化中转换为字符串时,每个客户机都将看到其本地时间,例如您在StackOverflow上看到的内容。作为保留每个时间戳及其时区的替代方法,您可以使用DateTimeOffset。一般来说……当有更好的类型时,千万不要考虑使用字符串……记录您的服务并声明它应该只发送utc值,并且只返回utc值。让用户界面处理转换。看看这是甜美的音乐,以弥补时间受损的耳朵…谢谢你的提示!然而,我对UTC有点迷茫。如果UTC+6中的客户机在2014年10月31日20:00存储CreatedDate,则UTC中的服务读取的值仍然是2014年11月1日00:00,对吗?在UTC中存储和返回日期意味着您在UTC+0中执行此操作。不涉及时区。这也意味着由客户决定当前时区,并相应地格式化/更改日期时间。也许我搞错了什么。如果我在UTC+0中拥有所有内容,这也意味着我的服务将在UTC+0中存储CreatedDate,但这不是我想要实现的目标。我希望服务能够将日期保存在客户机中:很好的回答,你把一切都说清楚了,并给出了几种解决方案。非常感谢你!回答得很好,你把一切都说清楚了,并给出了几个解决方案。非常感谢你!
myClass.CreatedDate = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);