我正在寻找在用户当前时区以外的时区中显示web应用程序时间的建议。
我们将日期/时间以UTC/GMT格式存储在数据库中,因此将时间格式化为UTC/GMT或用户当前时区不是问题。然而,在其他情况下,我们需要从任意时区的角度显示时间(例如,无论用户是在西海岸、中部还是东部,该页面上的每个日期/时间都是东部的)。
在过去,我们存储偏移量或时区信息,然后在。net的服务器代码中完成计算,或者我们在javascript中做了一些客户端操作,我宁愿避免,因为这一切都变得非常依赖于javascript和用户的浏览器。我想知道在更多的客户端/MVC类型的应用程序中做到这一点的最佳方法。
下面是一个例子:
- 日期存储在db: 1302790667 (Thu, 14 Apr 2011 14:17:47 GMT)
- 中央时区客户端显示的转换日期:thapr 14 09:17:47 2011
- 我实际想显示的日期,总是在东部时区:Thu Apr 14 10:17:47 2011
在上面的例子中,获取UTC(#1)或用户当前时区(#2)的时间很容易,但获取#3就比较困难了。我的选择似乎是:
- 在数据库中存储偏移量或时区,并在客户端进行计算-这是我们过去在。net中所做的,但在客户端代码中似乎更混乱是我们目前试图避免的路径。
- 在服务器上进行转换并发送完整的日期以显示给客户端-客户端接收字符串("Thu Apr 14 10:17:47 2011")。这可以工作,但不是很灵活。
- 在服务器上进行转换,将其分解成部分并将其发送给客户端,然后将它们重新组合在一起。("{DayOfWeek:Thu, Month:Apr, Day:14, Hour:10, Minute:17}")。这为我们提供了正确的数据,并在格式化日期方面提供了更多的灵活性,但在这种情况下感觉有点错误。
还有其他选择吗?其他人是如何处理类似情况的?谢谢。
我们的结果:
- 我尝试了一些库,如Datejs、MS Ajax等,但我对它们从来都不满意。Datejs在我的几个测试用例中根本不起作用,没有积极维护,并且似乎非常关注我们不需要的语法糖(date.today().first().thursday()等)我们确实使用jQuery进行一些基本的日期/时间解析。我遇到了很多"自己动手"的客户端日期转换"技巧",其中大多数只处理到UTC的转换,开始工作得很好,然后最终在一些边缘情况下崩溃。这是90%的标准UTC转换的解决方案,但没有解决我们的"任意时区"问题。
在转换例程添加的代码复杂性和它们似乎引起的错误之间,我们决定在大多数时候避免客户端日期处理。我们使用现有的日期处理例程在服务器上进行日期转换,并将格式化的日期或信息作为属性传递给视图使用。如果我们需要一个单独的日期,我们只需添加另一个属性。通常我们一次只需要几个属性(即EventDateUTC, eventdatellocal, EventDateAlwaysAustralia和EventDayOfWeek)。
我建议您查看一下Datejs库。它为基本的JavaScript日期操作提供了一系列扩展,包括"setTimezone()"方法和将日期转换为格式化字符串以供显示的灵活方法。
当问题中没有明确允许使用库时,我通常会犹豫是否建议使用库,但是Datejs不是很大,而且非常可靠(尽管它被称为"alpha"版本)。如果您不希望依赖这样的东西,那么您可能希望看看它,看看它的扩展是如何实现的基础。