.Net中仅处理跨时区的日期
好吧,一口气。因此,我的问题是,我需要存储一个到期日期,其中仅需要日期部分,并且我不希望进行任何时区转换。因此,例如,如果我将到期时间设置为" 2008年3月8日",那么我希望将该值返回给任何客户端,无论其时区如何。
将其作为DateTime进行远程处理的问题在于,它以" 08 March 2008 00:00"存储/发送,这意味着对于从我以西的任何时区进行连接的客户端,它将转换并因此转换为" 2008年3月7日"
有什么建议可以干净地处理这种情况吗?显然,将其作为字符串发送即可。还要别的吗 ?
谢谢,
伊恩
解决方案
回答
我们可以将其发送为UTC时间
dateTime1.ToUniversalTime()
回答
我认为以时间戳记字符串形式发送将是最快/最简单的方法,尽管我们可以考虑强制使用语言环境来停止时间转换。
回答
我们可以创建一个结构日期,以提供对所需/所需详细信息的访问,例如:
public struct Date { public int Month; //or string instead of int public int Day; public int Year; }
它轻巧,灵活,可为我们提供完全控制。
回答
为什么不将其作为字符串发送,然后根据需要将其转换回日期类型?这样,它将不会在不同时区进行转换。把事情简单化。
编辑:我喜欢Struct的想法,允许良好的功能。
回答
我过去在应用程序上处理此问题的最简单方法是将日期以yyyy-mm-dd格式存储为字符串。它是明确的,不会被任何东西自动翻译。
是的,这很痛苦...
回答
我不确定我们指的是什么远程处理技术,但这是WCF的真正问题,它目前仅支持将DateTime序列化为xs:DateTime,不适用于我们对时区不感兴趣的仅日期值。
.NET 3.5引入了新的DateTimeOffset类型,该类型对于在时区之间传输DateTime很有用,但对于仅日期的情况没有帮助。
理想情况下,WCF需要根据以下要求可选地支持xs:Date来序列化日期:
http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215
回答
我这样做是这样的:每当我在内存中存储日期或者将日期存储在文件中时,它总是位于UTC的DateTime中。当我向用户显示日期时,它始终是一个字符串。当我在字符串和DateTime之间进行转换时,我也会进行时区转换。
这样,我就不必在逻辑中处理时区,仅在演示中就可以。