Aar*_*her 6 html php mysql timezone utc
我一直在寻找几个小时的时间来了解在PHP/MySQL Web应用程序中使用时区的最佳方法,找到明确的答案很难.从我到目前为止学到的东西,最好用UTC中的每个人的东西存储在数据库中(如果我错了,请纠正我).
当用户注册时,我会询问他们是否有时区,然后将其存储在那里.这将是这种格式的下拉菜单:
<option value="Europe/London">(GMT) Greenwich Mean Time : London</option>
Run Code Online (Sandbox Code Playgroud)
我正在构建的应用程序将允许用户在未来与人(会议)进行安排,就像日历一样.显然,在一年的时间里,不同的时区有不同的夏令时,任何想法我会如何迎合这一点?
假设来自英国的用户在2013年1月24日下午3:00召开会议并邀请居住在加利福尼亚州的人参加此次会议,我如何获得该会议以便美国人在他/她的时区和英国用户看到会议它在他/她的时区?(请注意,两个用户都已注册并设置了他们的时区).
有没有人有明确的解释,也许有一些例子?或者可以指出我能找到的地方?
谢谢
ste*_*red 10
我在一年多前为私人飞机运营商编写的PHP/MySQL应用程序中广泛处理了这种情况.在这两个平台上处理时区有不同的策略,但我会解释我是如何做到的.我将MySQL服务器设置为UTC,并在用户在用户配置文件的注册过程中指定的时区中运行每个PHP脚本.
MySQL和PHP(PHP 5.2及更高版本)都具有本机日期时间数据类型.MySQL的datetime是一种原始数据类型,而PHP 5.2及以上版本提供了内置的DateTime类.MySQL datetime数据类型不包含时区的元数据,但PHP DateTime对象始终包含时区.如果PHP datetime构造函数未在第二个参数中指定可选时区,则PHP datetime构造函数使用php环境变量.
MySQL和PHP都在配置文件中设置了默认时区.MySQL使用配置文件中为每个数据库连接设置的日期时间,除非用户在使用该命令启动连接后指定不同的时区SET time_zone = [timezone];.PHP还使用服务器配置文件中设置的时区为每个脚本设置时区环境变量,并且可以date_default_timezone_set()在脚本启动后使用PHP函数覆盖此环境变量.
PHP DateTime类有一个名为timezone的属性,它是一个PHP DateTimeZone对象.DateTimeZone对象使用精确时区的字符串指定.该时区的列表是全面的,有上百个世界各地的各个时区. PHP时区将自动计算夏令时.
当用户在Web应用程序中生成日期时间时,请在用户配置文件的时区中构造PHP日期时间对象.然后使用该setTimezone方法将DateTime对象修改为UTC时区.现在您拥有UTC的用户日期时间,您可以将该值存储在数据库中.使用DateTime format方法将数据表示为MySQL接受的格式的字符串.
因此用户生成一个日期时间,并在用户指定的时区中创建一个PHP datetime对象:
// set using an include file for user profile
$user_timezone = new DateTimeZone('America/New_York');
// 1st arg in format accepted by PHP strtotime
$date_object1 = new DateTime('8/9/2012 5:19 PM', $user_timezone);
$date_object1->setTimezone(new DateTimeZone('UTC'));
$formated_string = $date_object1->format('Y-m-d H:i:s');
$query_string="INSERT INTO `t_table1` (`datetime1`) VALUES('$formated_string')";
Run Code Online (Sandbox Code Playgroud)
从数据库中检索值时,以UTC格式构建,然后转换为用户的时区.
$query_string="SELECT `datetime1` FROM `t_table1`";
$date_object1=new DateTime($datetime_string_from_mysql, new DateTimeZone('UTC');
$date_object1->setTimezone($user_timezone);
$string_for_display_in_application = $date_object1->format('m/d/Y g:i a');
Run Code Online (Sandbox Code Playgroud)
使用此方法,您的日期时间值始终以db存储在UTC中,并且用户始终会在其配置文件的时区中体验值.如果需要,PHP将针对每个时区更正夏令时.
一个问题:这个解释不包括MySQL时间戳数据类型.我建议使用MySQL datetime datetype来存储datetime值,而不是timestamp数据类型.时间戳数据类型是手册中涵盖这里.
编辑: 您可以使用listIdentifiers生成包含每个PHP时区字符串的数组,这是DateTimeZone类的静态方法.
| 归档时间: |
|
| 查看次数: |
3688 次 |
| 最近记录: |