125

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

约翰在悉尼工作。早上 9:00,他在苏黎世服务器上运行的 Web 应用程序中记录了一个事件。第二天,他前往纽约参加应讨论该事件的紧急会议。在会议期间,他按日期和时间搜索事件。

在我看来,这里至少有两个问题:

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

当 John 搜索事件时,他会知道事件发生在 9:00,但他应该在 Web 浏览器中输入什么?当他只是输入“9:00”作为时间戳时,他将找不到任何东西,因为那可能是苏黎世或纽约时间(由于尚未找到该事件,该应用程序无法知道它发生在 Sidney,所以它不能自动选择正确的时区)。

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

第二个问题是如何显示结果。如果来自全球各地的团队需要讨论该事件(并查找相关事件,请考虑一次针对全球多个站点的黑客攻击)。

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

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

4

7 回答 7

119

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

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

您的大多数用户可能不会或根本不会更改时区。在大多数情况下,您概述的情况并不常见。通过实施具有合适默认值的下拉菜单,您应该能够为那些四处走动的人提供足够的便利(因为他们通常比非旅行者更了解时区)。

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


总结以上内容:

  • 首次运行时,保存设备设置的时区。
  • 使用该时区作为默认时区。总是假设那个时区。
  • 如果设备切换时区,请添加一个下拉列表以选择事件所在的时区,默认为设备自己的时区。
  • 添加选项以手动显示/隐藏此时区下拉菜单。
  • 始终以 UTC 格式存储时间戳。
于 2012-06-07T02:40:17.537 回答
33

在我们的应用程序中,我们一般会在用户第一次注册时存储用户的时区,就像在论坛网站上经常看到的那样,并且总是以时区显示时间

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

我必须解决一个类似的用例,其中定制的通知,如“新年快乐”,可以发送给网络应用程序的所有用户。由于用户分布在世界各地,我们需要根据时区显示通知。在 UTC 中存储时间戳很好地满足了我们的目的,没有打嗝。

在您的用例中,如果您没有将用户时区存储在某处,那么您将永远无法在不要求用户输入的情况下准确地返回搜索结果,除非您开始使用 gmaps 之类的某种位置检测,但那不是可靠。因此,您每次都需要询问时区,以确保用户知道他在网站中输入的内容。

如果您确实有时区信息,则应使用时区设置运行整个 Web 应用程序。因此,当用户确实搜索 9:00 时,他将使用悉尼时区进行搜索。另一方面,如果他在纽约创建活动,他将使用悉尼时区创建活动。我们通过在显示日期时始终显示时区来解决这种情况。

希望能帮助到你!:)

于 2012-06-07T03:13:42.983 回答
12
  1. 世界标准时间。把事情简单化。

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

    如果您知道用户将在或前往悉尼参加活动,那么他们在安排前往活动的交通工具时会考虑该时区。他们目前在纽约的事实在很大程度上是无关紧要的。当然,如果您的应用程序在多个时区显示日期,它应该始终在日期旁边显示时区,例如09:00 EST

    如果它不会使您的界面过于混乱,您可以在事件时区和本地时区显示日期,例如2012-06-13 09:00 EST (2012-06-12 19:00 EDT)

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

    同样,我将专注于搜索与用户最相关的时区(例如事件时区),并在搜索结果中优先考虑这些结果,但您也可以返回与用户相关的其他时区匹配的事件(例如当地时间)。如果你这样做,你应该在匹配的时区显示事件日期,特别是如果你突出显示匹配的文本。

于 2012-06-12T01:10:46.557 回答
7

在这里,我给出了最佳可用性的建议,而不会过多地关注实现的可行性。
1.第一次在db中存储事件,大家都同意用UTC存储。

2.为了给用户最好的体验,保存用户的时区历史。如果您可以保存时区更改的时间戳,那就更好了。这将使我们能够让用户自由查询,而无需每次都明确指定时区。

因此,有了这些功能,让我们看看 John 对“9.00”的搜索查询将如何处理:
有了上述功能,现在我知道 John 一直在 2 个时区(或获取提到的时间段的时区列表)。所以我会将 9.00 从悉尼时区转换为 UTC,发出查询。还将 9.00 从纽约时区转换为 UTC,触发查询。结果,我将向 John 显示 2 行,显示他在 9 点在悉尼和 9 点在纽约所做的事情。在这种情况下,纽约行将是空白的,但我认为仍然应该向用户显示,只是为了通知他我们也搜索了这个时区。

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

如果最近更改了他的时区,则每当他登录应用程序时,都应该通知您,您的默认时区已更改为本地时区。
在创建事件时,假设用户从下拉列表中选择时区。让我们不要通过提供世界所有时区的选项来给用户带来负担。下拉列表的第一个选项应该是用户设备的当前时区。在他的时区历史中的时区之后,然后是UTC,然后是他迄今为止从未使用过的剩余时区。

4.如果来自世界各地的团队需要讨论事件,如何显示结果:

我想将此用例划分为 2 个或超过 2个团队。
对于只有 2 个团队,我希望每个团队在其本地时区和其他团队的时区看到时间戳。(我个人更喜欢在安排会议时在另一端的人的时区交谈,以方便他安排会议)。对于超过 2 个团队,最好考虑更常见的时区,即 UTC。因此,在这种情况下,每个用户都应该在 2 个时区、UTC 和他的默认时区看到时间戳。

给出这些建议的目的是让用户不需要在本地时间进行任何计算,但同​​时他应该能够在他们喜欢的时区与其他用户流利地交流。

于 2012-06-09T20:33:32.677 回答
5

好的,我的方法与其他方法不同:

首先,我事先假设了一些事情。

列出事件的人有智能手机(如果它是浏览器,我不必做这些假设):

  1. 全球定位系统

  2. HTML5 能力。

  3. Javascript 能力

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

解决方案:显然UTC,我在下面覆盖了程序:

步骤 1. 使用Geolocation API 使用用户的 Geolocation

    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 的参数,例如Yahoo API(使用标志 R 将纬度转换为时区)以获取用户时区。

=>用户时区是在没有用户输入的情况下确定的(我之所以使用它是因为你不能简单地假设用户知道他居住的地方的时区,我只是在几个月后才知道我的时区或某个地方的某事:P,非常愚蠢! )

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

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

用户界面

=> 使用谷歌日历 API 或一些日历 API

相关阅读:

  1. 在不使用 Geonames.org 等 Web 服务的情况下根据纬度/经度确定时区

  2. 从纬度经度查找时区

我知道它只是为了展示一些如何解决这个问题的想法。但是,当使用设备 API确定时区时,看看它对用户来说变得多么准确和轻量级

希望能帮助到你!

于 2012-06-12T02:52:35.167 回答
2

对于那种特殊情况,我会同时存储本地时间和 UTC 时间。UTC 有点重要,用于将时间同步和转换为当前时区。本地用于搜索和其他信息,例如:

你有一个会议:

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

或类似的东西。另一种方法是存储创建时区,并在运行时转换(这在用户更改会议时间的情况下特别好)。无论哪种方式,主要原因是能够恢复原始创建时间,以便用户可以参考它。

于 2012-06-07T04:45:29.507 回答
2
  1. 我应该如何将时间戳保存在数据库中

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

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

  1. 我应该如何在 UI 中呈现它们

当用户搜索“9:00”时,我会在 UTC creation time 本地时间搜索包含“9:00”的事件。对于结果,我将在其中显示一个结果表creation time(这旨在显示可能已在不同时区创建的时间戳,因为我们假设用户正在寻找他创建事件的时间,无论他身在何处。) ,并在下面显示第二个结果表以及相关结果,可能带有标题“不是您要查找的内容?查看相关结果”(包括剩余的 UTC 和本地时间结果)。

总的来说,我会显示 UTC 时间、本地时间、creation time以及creation time zone(即创建它的事件的本地时间和时区),按 UTC 时间排序,这样您就可以看到哪个事件先出现,以防两个不同活动安排在两个不同时区的 9:00。

于 2012-06-07T21:18:40.040 回答