我如何处理我的webapp中的时区?

我正在寻找更好的理解下面的用户故事:

约翰在西德尼工作。 早上9点,他在苏黎世的一台服务器上运行的一个networking应用程序中logging了一个事件。 第二天,他前往纽约紧急会议,讨论事件。 在会议期间,他按date和时间search事件。

正如我所看到的,这里至less有两个问题:

  1. 我应该如何将时间戳保存在数据库中?
  2. 我应该如何在UI中展示它们

当约翰search这个事件时,他会知道它发生在9:00,但是他应该在networking浏览器中input什么内容? 当他刚刚input“9:00”作为时间戳时,他不会find任何东西,因为这可能是苏黎世或纽约时间(因为事件尚未发现,应用程序无法知道它发生在悉尼,所以它不能自动select正确的时区)。

向用户询问可能包含时区的时间戳的好方法是什么?

第二个问题是如何显示结果。 如果来自全球各地的团队需要讨论这个事件(并且find相关的事件,那么就要立即针对遍布全球的几个站点的黑客攻击)。

显示可能在不同时区创build的时间戳的一个很好的例子是什么?

注意:请专注于需求的可用性。 我可以弄清楚自己的数据库映射。 目前,我不确定工作stream程。 它应该以非侵入性/直观的方式询问/呈现必要的信息。 如果可以的话,给一个已经解决了这个问题的现有的networking应用程序的链接。

存储时间戳的问题很简单:将它们存储在UTC中。

至于显示它们,采取设备的时区设置并将其用作当前时区是有意义的。 也就是说,“时间input”框旁边应该有一个时区下拉菜单,默认为设备的当前时区,用户可以根据需要进行更改。

大多数用户可能不会更改时区,或者根本不改变时区。 在大多数情况下,你概述的情况是不常见的。 通过实施一个合适的默认下拉菜单,您应该能够让那些在四处走动的人变得简单(因为他们通常比非旅行者对时区有更好的理解)。

实际上,更好的办法是保存设备在第一次运行时设置的时区,然后查看是否发生了变化。 如果确实发生了变化,那么用户可能是旅行者,并且可能会从时区下拉菜单中受益。 否则,只是不显示下拉菜单和默认的设备时区(因为用户不需要知道它们)。 无论哪种情况,都可以在应用中设置一个允许用户手动显示/隐藏时区下拉菜单的设置。


总结以上内容:

  • 首次运行时,保存设备设置的时区。
  • 使用该时区作为默认时区。 总是假定时区。
  • 如果设备切换时区,则添加一个下拉菜单以select事件所在的时区,默认为设备自己的时区。
  • 添加一个选项来手动显示/隐藏这个时区下拉菜单。
  • 始终使用UTC存储时间戳。
  1. 世界标准时间。 把事情简单化。

  2. 使用与用户最相关的时区。

    如果您知道用户将要进入悉尼或者前往悉尼参加这项活动,那么他们在安排运输活动时会考虑在该时区。 目前他们在纽约的事实在很大程度上是无关紧要的。 当然,如果您的应用程序在各种时区显示date,则应始终显示date旁边的时区,例如美国东部标准时间09:00

    如果没有太多杂乱的界面,你可以在事件时区和本地时区显示date,例如2012-06-13 09:00 EST(2012-06-12 19:00 EDT)

    我认为search是一个类似的问题,一个警告:我们可以容忍误报(得到的结果我们并不期待),但我们不能忍受错误的否定(没有得到我们期待的结果)。

    再次,我将重点search与用户最相关的时区(例如事件时区),并在search结果中给出这些结果的优先级,但是您也可以返回与用户相关的其他时区相匹配的事件(例如当地时间)。 如果你这样做,你应该在匹配的时区显示事件date,特别是如果你突出显示匹配的文字。

在我们的应用程序中,我们通常会在首次注册时存储用户的时区,就像在论坛网站上经常出现的一样,并且总是显示时区和时区

至于存储date,UTC是要走的路。 转换为UTC并将其粘贴到数据库中。 在检索时,只需将时间转换为为用户设置的时区即可。

我不得不解决一个类似的用例,在这里可以将自定义的通知(比如“新年快乐”)发送给所有的Web应用用户。 由于用户遍布全球,我们需要根据时区显示通知。 在UTC存储时间戳很好地服务于我们的目的,没有打嗝。

在你的用例中,如果你没有在某个地方存储用户时区,那么你将永远无法准确地返回你的search结果而不要求用户input,除非你开始使用像gmaps这样的位置检测,可靠。 所以你每次都需要询问时区,以确保用户知道他在网站上input的内容。

如果您确实有时区信息,则应该使用时区设置运行整个networking应用程序。 因此,当用户search9:00时,他将在悉尼时区search。 另一方面,如果他在纽约创造一个事件,他将创build一个与悉尼时区的事件。 我们通过在显示date时总是显示时区来解决这种情况。

希望能帮助到你! 🙂

在这里,我提出了最好的可用性build议,而不用担心实施的可行性。
1.对于以db存储事件的第一个问题,每个人都会同意以UTC存储它

2.提供最佳的用户体验,保存用户时区的历史。 如果你可以节省时区变化的时间戳,甚至更好。 这将使我们能够自由地给用户查询,而不必每次都明确地指定时区。

所以,有了这些function,让我们看看约翰将如何处理“9.00”的search查询:
有了上面提到的function,现在我知道约翰已经在2个时区之前(或者得到了提及时期的时区列表)。 所以我会从悉尼时区转换到UTC 9.00,发出查询。 也从纽约时区9.00转换为UTC,触发查询。 结果我会向John显示2行,显示他在悉尼的9.00和纽约的9.00所做的事情。 纽约线在这种情况下将是空白的,但我认为还应该向用户显示,只是为了通知他我们也search了这个时区。

3.向用户询问可能包含时区的时间戳的好方法是什么?

如果他的时区最近发生了变化,那么无论何时login应用程序,都应该给出一个通知,将您的默认时区更改为本地时区。
在创build事件时,可以说用户从下拉菜单中select时区。通过给出世界上所有时区的选项,不会给用户带来负担。下拉式选项应该是用户设备的当前时区。 在那个时区之后的时区,然后UTC,然后剩下的时区,他从来没有使用过的date。

4.如果要展示结果,全球各地的团队如果需要讨论这个事件:

我想把这个用例分成两个或两个以上的队伍。
对于只有2支球队,我宁愿每支球队都在当地时区和其他球队的时区中看到时间戳。 (为了便利,我个人更喜欢在另一端的时区在安排会议时进行交谈)。 对于2个以上的团队,最好考虑更常见的时区,即UTC。 因此,在这种情况下,每个用户都应该在2个时区(UTC)和默认时区中看到时间戳。

这些build议的目的是让用户不必在当地时间做任何计算,但同​​时他应该能够在他们的首选时区stream利地与其他用户进行交stream。

好吧,我有一个不同的方法比别人:

首先,我提前做了一些事情。

举办活动的人有智能手机(如果是浏览器,我不必做这些假设):

  1. 全球定位系统

  2. HTML5function。

  3. Javascriptfunction

我应该如何将时间戳保存在数据库中?

解决scheme:显然UTC ,我覆盖下面的程序:

第1步。使用Geolocation API使用用户的地理位置

window.onload = getMyLocation; function getMyLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(displayLocation); } else { alert("Oops, no geolocation support"); } } function displayLocation(position) { var latitude = position.coords.latitude; var longitude = position.coords.longitude; var div = document.getElementById("location"); div.innerHTML = "You are at Latitude: " + latitude + ", Longitude: " + longitude; } 

步骤2:将(Long,Lat)作为参数(Lat,Long)与TimeZone API的一些参数(如使用Flag R获取纬度转换为时区)来获取用户时区。

=> 用户时区是在没有用户input的情况下确定的 (我使用这个是因为你不能简单地假定用户知道他所在的时区,我只有在几个月后才知道我的时区或什么地方:P,很笨! )

每个Event表都有TimezoneEvent &等也可以有CityName然后创build另一个基于CityName的分类数据库表。 所以这里用户将有两列

 |---------------------------------------| |_____NewYork________|______Sydney______| | | | |Event 1 | Event 2 | |____________________|__________________| 

对于UI

=>使用Google Calendar API或某些Calendar API

相关阅读:

  1. 根据纬度/经度确定时区,而不使用像Geonames.org这样的networking服务

  2. 从经纬度查找时区

我知道它只是展示一些想法如何解决这个问题。 但是,当使用设备API确定时区时,可以看到用户对用户的精确度和轻量级

希望能帮助到你!

对于这个特殊的情况,我会存储本地和UTC时间。 UTC是一个主要的,用于同步和时间转换到当前时区。 本地用于search和其他信息,如:

你有一个会议:

 12:00 Monday (UTC) 9:00 Monday (Sydney, creation local time) 11:00 Monday (Zurich, local time) 

或类似的东西。 另一种方式是存储创build时区,并在运行时进行转换(如果用户将改变会议时间,则会更好)。 无论哪种方式,主要原因是能够恢复原始创build时间,以便用户可以参考它。

  1. 我应该如何将时间戳保存在数据库中?

在创build事件时,我将存储UTC时间和本地时区(又名creation time zone )。 我将使用我存储的将UTC时间转换为本地时间(又名creation time )并将其与UTC时间和creation time zone一起存储。

注:我可以从一开始就储存当地时间,但是当用户search一个事件时,我希望存在到当地时间的转换。 我也希望服务器可以检测客户端在哪个时区。

  1. 我应该如何在UI中展示它们

当用户search“9:00”时,我会在UTC creation time 当地时间search包含“9:00”的事件。 对于结果,我将在creation time显示一个结果表(这是为了显示可能在不同时区创build的时间戳,因为我们假设用户正在寻找他创build事件的时间,无论他在哪里),并在下面显示相关结果的第二个表格,或许是头部标题“不是你要找的东西?查看相关结果”(包括剩余的UTC和本地时间结果)。

总的来说,我将显示UTC时间,本地时间, creation timecreation time zone (即创build事件的本地时间和时区),按UTC时间sorting,以便您可以查看哪个事件先发生,如果两个不同的时间段的两个不同的事件安排在9:00。