好的 - 有点拗口。所以我遇到的问题是 - 我需要存储一个到期日期,其中只需要日期部分并且我不想要任何时区转换。因此,例如,如果我将到期设置为“2008 年 3 月 8 日”,我希望将该值返回给任何客户——无论他们的时区是什么。将其作为 DateTime 进行远程处理的问题在于它被存储/发送为“2008 年 3 月 8 日 00:00”,这意味着对于从我以西的任何时区连接的客户来说,它会被转换并因此翻转为“2008 年 3 月 7 日”任何建议干净地处理这种情况?显然将它作为字符串发送会起作用。还要别的吗 ?谢谢,伊恩
7 回答
我不确定您指的是什么远程处理技术,但这是 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 之间进行转换时,我也会进行时区转换。
这样我就不必在我的逻辑中处理时区,只需在演示文稿中。
您可以将其作为 UTC 时间发送
dateTime1.ToUniversalTime()
我认为作为时间戳字符串发送将是最快/最简单的方法,尽管您可以考虑强制语言环境停止发生时间转换。
您可以创建一个结构 Date 来访问您想要/需要的详细信息,例如:
public struct Date
{
public int Month; //or string instead of int
public int Day;
public int Year;
}
这是轻量级、灵活的,可让您完全控制。
为什么不将其作为字符串发送,然后根据需要将其转换回日期类型?这样它就不会在不同的时区转换。把事情简单化。
编辑:我喜欢 Struct 的想法,允许良好的功能。
我过去在应用程序上处理此问题的最简单方法是将日期存储为 yyyy-mm-dd 格式的字符串。它是明确的,不会被任何东西自动翻译。
是的,这很痛苦……