【发布时间】:2011-02-15 09:45:44
【问题描述】:
我有一个保存 UTC 时间的数据库。这个时间可以显示在网页中,所以我被要求在页面中显示为当地时间,因为它可以从任何国家/地区查看。一位同事提到了一些关于从当前线程(在服务器上)获取国家/地区设置的事情,但我找不到任何细节。我想做的事可能吗?
【问题讨论】:
我有一个保存 UTC 时间的数据库。这个时间可以显示在网页中,所以我被要求在页面中显示为当地时间,因为它可以从任何国家/地区查看。一位同事提到了一些关于从当前线程(在服务器上)获取国家/地区设置的事情,但我找不到任何细节。我想做的事可能吗?
【问题讨论】:
这是我在连接到 MySQL 数据库的登录文件中的 PHP 中完成的:
//set local timezone
date_default_timezone_set('America/Denver'); //use local TZ
然后,每次访问数据库时,您都在设置该会话的时区以及与之关联的任何输入/输出。
【讨论】:
如果您(和您的网站)熟悉 javascript,有一种非常简单的方法可以完成此操作。
首先,在服务器端,您可以将 UTC 日期/时间格式化为 RFC 3339 格式(由 icalendar 等协议使用的互联网时间标准)。 RFC 3339 的基本语法是:
YYYY-MM-DDTHH:MM:SS
这样,我在哪里,时间就会是:
2010-05-04T05:52:33
但是当时间不是本地时间,而是 UTC 时,您在末尾添加一个 Z 来表示这一点。因此,就我而言,由于我距格林威治标准时间为 -0500 小时,因此上述同一时间将是:
2010-05-04T10:52:33Z
所以,首先让服务器将上述内容输出到您网页的 javascript。然后,javascript 可以解析该时间戳,并将输出调整到浏览器时区的日期和时间(由托管浏览器的计算机确定)。您应该记住,如果用户来自东京并且正在西班牙查看您的网站,他们将看到东京时间的时间戳,除非他们调整了计算机时钟。
所以 javascript 将是:
var time_string_utc = some_server_variable; // timestamp from server
var time_string_utc_epoch = Date.parse(time_string_utc);
var time_utc = new Date();
time_utc.setTime(time_string_utc_epoch);
此时,您已将 javascript 日期对象设置为您的 UTC 时间戳。对上面发生的事情的快速解释:
第一个变量假定您已将时间戳字符串从服务器传递给该变量。
第二个变量使用Date.parse()方法将字符串转换为纪元时间戳。
第三个变量创建未设置的 Date 对象。
最后一行使用setTime 方法,它从一个纪元时间戳中设置一个Date 对象。
现在您有了对象,您可以根据需要将其输出给用户。作为一个简单的实验,您可以使用:
document.write(time_utc);
如果您在我的时区使用我开始时使用的 UTC 时间戳:
2010-05-04T10:52:33Z
会给:
Tue May 04 2010 05:52:33 GMT-0500 (CST)
但您可以使用各种 javascript 方法将时间格式化为更令人愉悦的格式。
无需猜测用户所在的国家/地区,甚至无需调整您的时间戳,只要您信任用户的本地浏览器/计算机时区即可。
再次,简短的版本:
var time_string_utc = some_server_variable; // UTC time from server
var time_string_utc_epoch = Date.parse(some_server_variable);
var time_utc = new Date();
time_utc.setTime(time_string_utc_epoch);
document.write(time_utc);
【讨论】:
time_string_utc 变量。使用它或删除它会更清楚。
编辑:
考虑一下,我认为一旦掌握了客户的文化,就不可能显示当地时间。我当然很想看看你同事的建议。
例如,了解美国文化并没有帮助,因为美国有很多时区。
我认为像 Anthony 建议的那样使用 Javascript 是可行的方法......
旧:
您可以使用设置当前(选择的或浏览器报告)文化的代码覆盖InitializeCulture() 方法:
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new
CultureInfo(selectedLanguage);
【讨论】:
还可以考虑阅读this thread,它深入探讨了跨时区处理夏令时问题的注意事项
【讨论】:
当然是可能的。您只需要找到country settings 来检测您的用户来自哪个国家/地区,然后修改显示的日期以适合该国家/地区的时间。您还可以找到另一种方法来检测用户的国家/地区。(可能来自他的IP地址)。
我确信管理此问题的最佳方法是让您的同事知道您需要有关项目的国家/地区设置实施以及如何使用它的更多详细信息。
【讨论】: