【问题标题】:Display date and time according to the user's time zone in Coldfusion在 Coldfusion 中根据用户的时区显示日期和时间
【发布时间】:2010-11-24 15:18:51
【问题描述】:

我需要根据登录用户的本地时区在我的应用程序中显示日期时间值。我希望我的应用能够自动检测用户的时区,然后相应地显示调整后的服务器日期和时间。

您如何在 Coldfusion 中做到这一点?

我正在寻找一种在任何时候都不会提示用户选择时区的解决方案,例如 Facebook。

谢谢

【问题讨论】:

  • 一般只能确定用户的时区偏移量,不能考虑夏令时。您可以尝试使用 IP 地理定位,但这在澳大利亚通常不够具体(Broken Hill 的用户将地理定位到悉尼,并且不共享时区)。在某些时候,我很确定您会找到一个需要询问用户的极端案例。最好只在客户端呈现日期(假设用户已经正确设置了他们的计算机!)

标签: coldfusion timezone cfml


【解决方案1】:

我不会让 CF 进行格式化,而是推送标准化的日期表示(如 UTF( 并让 JavaScript 格式化日期。这样,日期就会被格式化为计算机上设置的任何时区。

这避免了在区域变化区域附近的错误查找、处理夏令时与未观察到的区域以及人们旅行(格式化为“家庭时间”与“本地时间”)。

添加:

这会以长格式转储当前时间。它是半即兴的,因此您需要查看JavaScript Date Object 的方法以获取更多格式选项。

<cfset n = dateconvert("local2utc",now())>
<script>
 d = new Date();
 d.setUTCFullYear(#dateformat(n, "yyyy")#);
 d.setUTCMonth(#dateformat(n, "m")#);
 d.setUTCDate(#dateformat(n, "d")#);
 d.setUTCHours(#timeformat(n, "H")#);
 d.setUTCMinutes(#timeformat(n, "m")#);
 document.write(d.toLocaleString());
</script>

【讨论】:

  • 嗨,Ben - 您能否提供一些示例代码来说明您的意思?谢谢
  • 不要忘记 javascript 的月份编号为 0 - 11,因此 d.setUTCMonth(#dateformat(n, "m")#); 应该是 d.setUTCMonth(#dateformat(n, "m")# - 1); 以便 javascript 显示正确的月份。
【解决方案2】:

ColdFusion 是一种服务器端语言。因此,您无法直接确定客户的时区。

您可以在客户端使用 JavaSript,找出 timezoneoffset 并通过 Ajax 请求将其发送到 ColdFusion。

JavaScript:

var clienttime = new Date();
var time = clienttime.getTimezoneOffset()/60;

然后在服务器端你可以使用偏移量来计算你想要显示给用户的日期。

您还可以使用客户端 IP 来查找客户端所在的国家/地区,但是您必须使用外部服务来获取特定 IP 的国家/地区,并且您必须处理夏令时和每个国家/地区多个时区等问题。

【讨论】:

    【解决方案3】:

    如果您只是要求您的用户将他们的时区指定为他们的登录配置文件的一部分,将会更快、更准确;设置一次就忘记了。

    否则,您需要查找 IP 地址并确定该 IP 地址所在的位置,确定时区,然后相应地显示时间。即使您将信息存储在 cookie 或会话变量中,当您可以询问用户他们所在的时区时,这也有点麻烦。

    【讨论】:

    • 嗯,是的,也不是。我的目标是在用户注册时通过 IP 查找时区。所以它是一次关闭。是的,我可以要求 - 但我的问题明确指出不会提示用户。要求用户选择时区技术性太强。他们是外行,而不是开发人员:)
    • 在这种情况下,您需要访问商业地理编码 API,例如 maxmind (maxmind.com/app/ip-location),之后您必须使用 Paul Hasting 的 tzmap 之类的工具确定用户所在城市的时区在 riaforge 上:tzmap.riaforge.org
    • 不过我不得不说,哇,如果他们不知道自己的时区,那你就会遇到这样的困难人群。 ;)
    • 请记住,还有夏令时/标准时间的问题。因此,当它是 DST 时,您必须从时区偏移中减去一个小时。此外,DST 并非在所有地方同时开始和结束。所以基本上我要做的就是将他们当前的时区偏移记录为会话变量,并在每次登录后根据他们的城市重新计算它。这样,您就不必担心太多。
    【解决方案4】:

    如果您使用 cfwheels.org 并且您的用户不介意看到“昨天”或“10 分钟前”...那么 TimeAgoInWords() 就是您所需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多