Web 应用程序中的时区敏感日期和时间显示?

Posted

技术标签:

【中文标题】Web 应用程序中的时区敏感日期和时间显示?【英文标题】:Time Zone Sensitive Date and Time Display in Web Applications? 【发布时间】:2011-08-05 14:40:40 【问题描述】:

我正在寻找有关在用户当前时区以外的时区在 Web 应用程序中显示时间的建议。

我们将日期/时间以 UTC/GMT 格式存储在数据库中,因此格式化 UTC/GMT 时间或用户当前时区不是问题。但是,在其他情况下,我们需要从任意时区的角度显示时间(即此页面上的每个日期/时间都是东部时间,无论用户是否在西海岸、中部、东部、等等。)。

过去我们存储了偏移量或时区信息,然后在 .Net 中在服务器代码中进行计算,或者我们在 javascript 中进行了一些我希望避免的客户端操作,因为这一切都变得非常依赖在 javascript 和用户的浏览器上。我想知道在更多客户端/MVC 类型的应用程序中执行此操作的最佳方法。

这是一个例子:

    数据库中存储的日期:1302790667(2011 年 4 月 14 日星期四 14:17:47 GMT) 为中部时区客户显示的转换日期:2011 年 4 月 14 日星期四 09:17:47 我真正想要显示的日期,总是在东部时区:2011 年 4 月 14 日星期四 10:17:47

在上面的例子中,很容易获得 UTC (#1) 或用户当前时区 (#2) 的时间,但很难获得 #3。我的选择似乎是:

    在 db 中存储偏移量或时区并在客户端上进行计算 - 这是我们过去使用 .Net 所做的,但在客户端代码中似乎更加混乱是我们目前试图避免的路径。 在服务器上进行转换并发送完整的日期以显示给客户端 - 客户端收到一个字符串(“Thu Apr 14 10:17:47 2011”)。这可行,但不是很灵活。 在服务器上进行转换,将其分成几部分并将它们发送到客户端,然后将它们重新组合在一起。 (“DayOfWeek:Thu, Month:Apr, Day:14, Hour:10, Minute:17”)。这为我们提供了正确的数据,并为我们在格式化日期方面提供了更大的灵活性,但在这种情况下感觉有点不对劲。

还有其他选择的想法吗?其他人如何处理类似情况?谢谢。

【问题讨论】:

你最终使用了什么?我正要试一试this,我有同样的客户要求,我正在为此争分夺秒! 我们最终在服务器上进行了所有计算。我会添加一个答案。 【参考方案1】:

我们的结果:

    我尝试了一些库,如 Datejs、MS Ajax 等,但我对它们从来都不满意。 Datejs 在我的一些测试用例中根本不起作用,没有积极维护,并且似乎非常关注我们不需要的语法糖(date.today().first().thursday(),等等) 我们确实使用 jQuery 进行一些基本的日期/时间解析。 我遇到了很多“自己动手”的客户端日期转换“hacks”,其中大部分只解决了转换为 UTC 的问题,开始工作正常,但最终在一些边缘情况下崩溃了。 This one 是很多标准 UTC 转换的 90% 解决方案,但没有解决我们的“任意时区”问题。

在转换例程添加的代码复杂性和它们似乎导致的错误之间,我们决定在大多数情况下避免客户端日期处理。我们使用现有的日期处理例程在服务器上进行日期转换,并将格式化的日期或信息作为属性传递给视图以供视图使用。如果我们需要一个单独的日期,我们只需添加另一个属性。通常我们一次只需要几个属性(即 EventDateUTC、EventDateLocal、EventDateAlwaysAustralia 和 EventDayOfWeek)。

【讨论】:

【参考方案2】:

我建议您查看Datejs 库。它为基本的 JavaScript 日期操作提供了一系列扩展,包括“setTimezone()”方法和将日期转换为格式化字符串以进行显示的灵活方法。

当问题中未明确允许使用库时,我通常会犹豫推荐库,但 Datejs 不是很大而且相当可靠(即使它被称为“alpha”版本)。如果您不想依赖类似的东西,您可能还是想看看它,只是为了了解它的扩展是如何实现的基础知识。

【讨论】:

以上是关于Web 应用程序中的时区敏感日期和时间显示?的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略javascript时区将日期时间发送到服务器

PHP,Codeigniter:如何在Web应用程序中根据用户时区/位置设置日期/时间?

javascript显示中的时区偏移

NSdate(时区)中的问题日期时间显示过去 5 小时 30 分钟

如何根据 Big Query 中的 UTC 时间戳在 Data Studio 中显示本地时区的日期/时间

如何在javascript中将日期时间从用户时区转换为EST [重复]