2009-01-26 158 views
7

我正在开发一个充当简单项目管理软件的国际软件,我正面临一个问题。这个问题是关于日期/小时和时区。
当从一个时区发送消息到另一个时区时,我可以将UTC(GMT)时间存储在我的数据库中,然后根据用户的时区显示不同的时间。但是当我只用日期工作时,这是无法完成的。
如果我说任务是由于3月21日。我是否应该认为这个日期在其他一些国家可以是20或22?你对这个问题有什么建议?如何处理不同时区的日期和时间?

+0

我可以为我自己的有关如何测试正确时区处理的相关(但不同)问题放置一个无耻的插件吗? http://stackoverflow.com/questions/477965/testing-correct-timezone-handling – 2009-01-26 20:13:09

+1

你必须发现它有趣,如果你在标签“本地化”或“国际化”搜索你只有两个问题,但如果你搜索“本地化”或“国际化”你会得到堆! – Evan 2009-01-30 04:58:49

回答

4

比方说,纽约的一位用户将项目的截止日期设置为“1月26日星期一任何时间”。这意味着“在布鲁塞尔的任何时间从1月26日星期一0600年1月26日星期二”和“1月26日星期一从2000年1月26日星期一任何时间”在洛杉矶

因此,在26日星期一2100完成任务是好的布鲁塞尔和纽约,但太晚在洛杉矶

一个可能的解决方法是从来没有只与日期工作。如果未指定时间,则将其设置为用户时区中指定日期的0000小时或2400小时。

用户可能需要处理奇怪的截止日期/时间,但作为曾经在国际上工作的人讲话,它有点与领土一致。

2

如果不存储确切的时间,您将无法实现您正在尝试执行的操作。你根本没有足够的信息。

2

如果您没有时间,则假定时间是应用程序主要语言环境中的业务结束时间,然后按照其他时间翻译该时间。另一种方法是在当地时间结束营业日并将其调整为UTC。当没有指定时间时,每个使用应用程序的人都需要了解你所做的默认时间假设。在大型企业中协调总部可能是最好的,而在当地情况同样重要的高度分散化的环境中协调当地时间可能是最好的。

1

最简单的解决方案就是为每个人显示相同的日期。截止日期将在最近的时区实际上是午夜。

否则,决定截止日期的默认时间应该在创建任务的时区中,例如, 21日美国东部时间17:00或3月22日00:00 EST,并在当地时区显示。时区差异会将观众推到前一天或第二天。

0

如果您有一个数据库实例,我会将所有日期存储在数据库服务器的日期时间时间戳中。如果您要对行进行时间戳记,请考虑T-SQL中的GetDate()或时间戳日期列的默认值。那么你有一个单一的参考点,所有的时间。考虑那里的UTC格式。

然后,访问日期的所有客户做自己转化为“本地时间”,可以通过类似的东西来解释:用户偏好,客户端计算机上的日期时间戳等

不知道更多,它很难准确地说出解决方案。

1

SQL 2008允许日期数据类型没有任何时间值与之关联。这可以让有人说我需要这个日期完成,但我不在乎它是+/-几个小时。如果选择的日期是2009年1月1日,但发生在2009年1月2日凌晨2点他们可能不在意。

当用户需要的东西在特定日期和时间,如商业上2009/1/1收盘价,那么你需要将其存储在一个日期时间为UTC,并将其转换为本地时间客户端完成。

这将需要很多复杂的出完成的东西时,指示的,它会要么被附近的某一天或一个特定的时间内完成。

2

如果你不存储你必须假设被输入的日期分秒是所需的日期,而不是为GMT任何调整。把它放在数据库中。西海岸的人们不得不假定,无论你在世界的哪个地方,到期日都是一样的。如果您想调整时区,则必须收集更多信息,例如小时,分钟和秒。

0

您的解决方案取决于您的应用和要求。

我倒是第一家店UTC +在你的数据结构偏移,所以可以很容易地显示任何时区。

如果任务或会议在伦敦于3月21日下午12点到期,那么最有可能在3月21日2130在阿德莱德(+0930)发生,但这是一个应用要求,不是任何邪恶的时区相关标准。

如果你想在灵活性最终,添加一个标志,可以使甚至同时由于在每一个时区或在同一时间,无论你在哪里(交错),并相应地显示事件。

0

您可能希望将日期存储在可识别时区的日期中。这会帮助你进行计算。例如,SQL Server 2008支持datetimeoffset that does precisely this。或者,如果您使用SQL 2005进行了一点努力,则可以编写自己的SQL CLR数据类型来支持这一点。