在客户端/用户时区的电子邮件内容/正文中显示日期/时间/小时

luk*_*uke 5 java email gmail spring freemarker

我有用 Java 编写的 Web 应用程序。它使用 Spring 和 Freemarker 从模板制作电子邮件,并使用 Spring JavaMailSender 发送它们。

我发送的电子邮件在其内容中包含时间。问题是服务器将时间存储在 UTC+00 时区,而客户端可能有不同的时区,例如 UTC+03。例如,在电子邮件内容中有 20/07/2017 11:30 (UTC+00),但收件人预计 20/07/2017 14:30 (UTC+03)。

我的问题是:是否可以在客户端时区的电子邮件内容中显示时间,而无需在服务器端了解他的时区信息?例如,是否有一些技巧可以告诉电子邮件客户端在他的时区解释给定的时间?

luk*_*uke 7

经过小规模研究后我自己的答案:

没有“真正的解决方案”可以在电子邮件中显示用户时区的时间而没有后端时区的信息,但有解决方法

解释:

  • 所有现代电子邮件客户端都会过滤掉 Javascript 内容,因此无法制作基于客户端时区显示时间随时间偏移的脚本。
  • 没有“魔术”可以让电子邮件客户端知道 html 的某些部分包含时间,并且应该以正确的方式对其进行格式化。特别是 Gmail 没有这样的功能。

解决方案:

在后端存储用户时区(我们向其发送电子邮件的用户)。

他们的时区可以通过两种方式保存:

  • Statically- 有一个地方(输入),用户可以在其中指定他的时区。例如在第一次登录和/或“设置”菜单中。
  • Dynamically- 用户时区是在他不知情的情况下动态获取的。例如,每次登录用户时区通过 Javascript 获取后,发送到后端并保存在数据库中。

解决方法:

当由于某种原因您不想实施“真正的解决方案”时,有一些解决方法

  1. 最简单的一种是显示时间,旁边有关于时区的信息。
    例如20/07/2017 11:30给出的信息不足,因为我们不知道时区,但20/07/2017 11:30 (UTC+03)给出了用户需要的所有信息。如果他想要在他自己的时区中获得时间,他只需要自己计算即可。

  2. 一个有点复杂的做法是提供一个指向网页的链接,该链接在客户端时区显示时间并在参数中获取时间。
    例如:
    https://some-time-resolving-service.com/time/20-07-2017/11/30
    使用 Javascript 检查客户端时区,并根据参数和他的时区显示带有时间的网站。
    互联网上有提供这种功能的服务。例如https://www.timeanddate.com/worldclock/由 slack 团队在其状态站点上用于在读者时区显示事件、中断等的时间。示例:https : //www.timeanddate.com/worldclock/fixedtime.html?iso=20181108T0035&p1=224这是我从这次事件中获取的:https : //status.slack.com/2018-11/8abae7811317864c

  3. 执行与第二点相同的操作,但不是提供链接嵌入图像并使用返回图像的服务。
    那样:
    <img src="https://some-time-resolving-service.com/timeimage/20-07-2017/11/30" alt="Time in the right timezone" height="50" width="100">
    或那样:
    <img src="https://some-time-resolving-service.com/timeimages/20-07-2017-11-30.png" alt="Time in the right timezone" height="50" width="100">
    我不确定它是否有效。

  • 所以看起来没有解决方案。在后端保存是不可靠的,因为用户可能正在旅行或刚刚完成他的旅行并返回家中。我们需要该地点的时区以及他查看我们界面的瞬间。所以我会提到UTC,尽管我不喜欢它。 (2认同)