信徒徽章与时区:放宽要求?

收到了一些关于“信徒”徽章的用户报告,该徽章需要连续登录 365 天才能获得。问题似乎在于,位于 UTC 时区较远地区(例如 PST+8)的用户需要考虑到底层“天”是按 UTC 时间计算的。我们发现有欧洲用户获得了该徽章,而其他人则不明白为何自己未能获得。

我认为发生的情况是:例如,一位位于 PST+8 的用户在 3 月 14 日清晨登录,然后在 3 月 15 日深夜再次登录(对他们而言是每天登录一次),但系统的徽章查询会将 3 月 15 日视为完全“跳过”,从而中断了他们连续 365 天的记录。这对最终用户来说可能会令人沮丧,尤其是当他们接近一年的“连续记录”尾声时。

我知道时区与数据库查询往往难以很好地兼容,但我想询问是否可以对查询进行某种“放宽”,例如在像一年这样较长的徽章周期内,对“UTC 天”给予一定的宽容度——谢谢。

9 个赞

存储访问记录的表使用的是普通日期而非时间戳,因此实现数小时的容差并不可行。

这最终取决于您的社区想要什么。您可以禁用该徽章,并创建一个等效的自定义徽章,将其触发条件设置为更少的天数,从而覆盖这些日期。或者,您可以检查那些访问间隔从未超过 1 天的用户。

7 个赞

感谢关注并回复。

他们希望无论时区如何,他们的徽章都能正常显示。长期用户是最热情的群体。:slight_smile:

我们有一个类似这样的 Data Explorer 查询,它帮助我们找到了问题所在:

-- [params]
-- user_list :users

WITH StartingPoints AS (
  SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
  FROM user_visits AS A
  WHERE NOT EXISTS (
     SELECT 1
     FROM user_visits AS B
     WHERE B.visited_at = A.visited_at - INTERVAL '1 day' AND
     B.user_id = A.user_id
  ) AND user_id IN (:users)
),
EndingPoints AS (
  SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
  FROM user_visits AS A
  WHERE NOT EXISTS (
     SELECT 1
     FROM user_visits AS B
     WHERE B.visited_at = A.visited_at + INTERVAL '1 day' AND
     B.user_id = A.user_id
  ) AND user_id IN (:users)
)
SELECT u.username, S.visited_at AS start_range, E.visited_at AS end_range, (E.visited_at - S.visited_at + 1) AS Days
FROM StartingPoints AS S
JOIN EndingPoints AS E ON E.rownum = S.rownum
JOIN users u ON u.id=S.user_id AND
u.id IN (:users)
ORDER BY u.id ASC, S.visited_at DESC 

……该查询列出了连续的访问段。由于涉及 UTC 部分(或者更确切地说,是底层日期而非日期时间的存储方式),我们认为即使存在“1 天间隔”,授予该徽章也是合理的。

我们将尝试基于修改此查询来创建另一个 Devotee(忠实用户)徽章,也许可以将 INTERVAL 改为’2 天’?

6 个赞

我们确实收到过一些关于此问题的“虔诚者”徽章支持请求。解决方法是通过 Rails 控制台授予该徽章。具体操作说明请参见:https://meta.discourse.org/t/how-to-award-a-non-custom-badge-through-the-console/103269。

如果有一种简单的方法可以放宽该徽章的条件,允许偶尔跳过几天,我认为这将是一个好主意。

5 个赞