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

Aar*_*lla 92 usability timezone web-applications

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

约翰在西德尼工作.早上9点,他在一个在苏黎世服务器上运行的网络应用程序中记录一个事件.第二天,他前往纽约参加紧急会议,讨论该活动.在会议期间,他按日期和时间搜索活动.

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

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

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

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

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

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

注意:请专注于要求的可用性.我可以自己弄清楚数据库映射.目前,我不确定工作流程.它应该以非侵入性/直观的方式询问/提供必要的信息.如果可以,请提供已解决此问题的现有Web应用程序的链接.

Nie*_*sol 88

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

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

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

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


总结以上内容:

  • 首次运行时,保存设备设置的时区.
  • 使用该时区作为默认时区.总是假设时区.
  • 如果设备切换时区,请添加下拉列表以选择事件所在的时区,默认为设备自己的时区.
  • 添加一个选项以手动显示/隐藏此时区下拉列表.
  • 始终以UTC格式存储时间戳.


Var*_*har 21

在我们的应用程序中,我们通常会在首次注册时存储用户的时区(如论坛网站上常见的那样),并始终显示时区与时区.

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

我必须解决类似的用例,其中可以向Web应用程序的所有用户发送自定义通知,例如"新年快乐".由于用户遍布全球,我们需要根据时区显示通知.在UTC中存储时间戳很好地满足了我们的目的,没有打嗝.

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

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

希望能帮助到你!:)


Ric*_*ole 11

  1. 世界标准时间.把事情简单化.

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

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

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

    我认为搜索是一个类似的问题,有一点需要注意:我们可以容忍误报(得到我们没想到的结果),但我们不能忍受假阴性(没有得到我们期待的结果).

    同样,我专注于向用户搜索最相关的时区(例如事件时区),并在搜索结果中优先考虑这些结果,但您也可以返回与用户相关的其他时区匹配的事件(例如当地时间).如果执行此操作,则应在匹配的时区中显示事件日期,尤其是在突出显示匹配的文本时.


Pra*_*lee 7

在这里,我提出了最佳可用性的建议,而没有太多关于实施可行性的问题.
1.对于在db中存储事件的第一个问题,每个人都同意将其存储在UTC

2中.为了提供最佳用户体验,请保存用户时区的历史记录.如果你可以节省时区变化的时间戳,那就更好了.这将使我们能够让用户自由查询,而无需每次都明确指定时区.

因此,与这些功能,让看到约翰的只是"9.00"搜索查询进行处理:
通过上面提到的功能,现在我知道约翰已经在2个时区,直到日期(或获得上述期间的时区列表).因此,我将从悉尼时区转换为9.00到UTC,触发查询.同时将9.00从NewYork时区转换为UTC,触发查询.结果我将向约翰展示两行,展示他在悉尼的9.00和纽约的9.00所做的事情.在这种情况下纽约线将是空白的,但我认为仍然应该向用户显示,只是告诉他我们也搜索了这个时区.

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

如果他的时区最近被更改,每当他登录应用程序时,都应该发出通知,您的默认时区将更改为本机时区.
在创建事件时,让我们说用户从下拉列表中选择时区.让我们通过提供世界所有时区的选项来减轻用户的负担.下拉列表的第一个选项应该是用户设备的当前时区.在他的时区历史的时区之后,然后是UTC,然后是他从未使用过的剩余时区.

4.如果要显示结果,如果来自全球各地的团队需要讨论该事件:

我想在2个或2个以上的团队数量之间划分这个用例.
对于2个团队,我希望每个团队在当地时区和其他团队的时区看到时间戳.(我个人更喜欢在安排会议时为了方便而在另一端的人员时区谈话).对于超过2个团队,最好考虑更常见的时区,即UTC.因此,在这种情况下,每个用户都应该在UTC和默认时区的2个时区中看到时间戳.

这些建议的目的在于用户不需要在当地时间进行任何计算,但同​​时他应该能够在其首选时区内流畅地与其他用户进行通信.

  • +1这是一个非常有趣的想法,因为我知道,用户在9:00在悉尼进入了一个事件,所以当一时间相同的用户搜索(没有明确的时区),我应该承担他的意思是"我在那里的那时" (2认同)

uda*_*day 5

好的,我有一个与其他人不同的方法:

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

列出活动的人拥有智能手机(如果是浏览器,我不必做出这些假设),其中包含:

  1. 全球定位系统

  2. HTML5 能力。

  3. Javascript 能力

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

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

步骤1.使用地理位置使用地理位置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;
    }
Run Code Online (Sandbox Code Playgroud)

步骤 2. 将 (Long,Lat) 作为参数提供给 TimeZone api 的某些 (Lat,Long),例如Yahoo API(使用标志 R 将纬度转换为时区)以获取用户时区。

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

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

|---------------------------------------|
|_____NewYork________|______Sydney______|
|                    |                  |
|Event 1             |  Event 2         |
|____________________|__________________| 
Run Code Online (Sandbox Code Playgroud)

用户界面用

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

相关阅读:

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

  2. 从纬度经度查找时区

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

希望能帮助到你!

  • 在没有地理位置的情况下很容易找到某人的时区。`new Date().getTimezoneOffset()` 在 UTC 后几分钟内给出它。 (4认同)
  • 好的,但这里的问题不在于获取用户所在的城市。这只是关于获取时区。使用不适用于每个浏览器/计算机的地理定位 API,然后重定向到日历 API,是一种*糟糕的方式来获取用户的时区*,当它在一行代码中可用时。 (2认同)