在 PHP Web 应用程序中使用时区

2023-11-24

我已经花了几个小时寻找在 PHP/MySQL Web 应用程序中使用时区的最佳方法,但很难找到明确的答案。根据我到目前为止所学到的,最好将每个人的资料存储在 UTC 的数据库中(如果我错了,请纠正我)。

当用户注册时,我会询问他们所在的时区,然后将其存储到该用户。这将采用以下格式作为下拉菜单:

<option value="Europe/London">(GMT) Greenwich Mean Time : London</option>

我正在构建的应用程序将允许用户在未来与人(会议)进行安排,就像日历一样。显然,在一年中,不同的时区有不同的夏令时,你知道我将如何满足这一点吗?

假设来自英国的用户设置了 2013 年 1 月 24 日下午 3:00 举行的会议,并邀请居住在加利福尼亚州的某人参加该会议,我如何才能让美国人在他/她的时区看到该会议,而英国用户则看到在他/她的时区吗? (请注意,两个用户都已注册并设置了时区)。

有人对此有明确的解释吗?也许还有一些例子?或者可以指出我在哪里可以找到它吗?

Thanks


一年多前,我在为私人飞机运营商编写的 PHP/MySQL 应用程序中广泛处理了这种情况。这两个平台有不同的策略来处理时区,但我将解释我是如何做到的。我将 MySQL 服务器设置为 UTC,并在用户配置文件注册过程中指定的时区运行每个 PHP 脚本。

MySQL 和 PHP(PHP 5.2 及更高版本)都具有本机日期时间数据类型。 MySQL 的 datetime 是一种原始数据类型,而 PHP 5.2 及以上版本提供了内置的日期时间类。 MySQL 日期时间数据类型不包含时区的元数据,但 PHP DateTime 对象始终包含时区。如果 PHP 日期时间构造函数未在第二个参数中指定可选时区,则 PHP 日期时间构造函数将使用 php 环境变量。

MySQL 和 PHP 都在配置文件中设置了默认时区。 MySQL 使用配置文件中设置的日期时间对于每个数据库连接,除非用户在使用命令启动连接后指定不同的时区SET time_zone = [timezone];。 PHP 还使用服务器配置文件中设置的时区为每个脚本设置一个时区环境变量,并且可以使用 PHP 函数覆盖该环境变量date_default_timezone_set()脚本开始后。

PHP DateTime 类有一个名为timezone,这是一个PHP DateTimeZone 对象。 DateTimeZone 对象是使用准确时区的字符串指定的。这时区列表非常全面,在全球有数百个单独的时区。PHP 时区将自动考虑夏令时。

当用户在 Web 应用程序中生成日期时间时,在用户个人资料的时区中构造一个 PHP 日期时间对象。然后使用setTimezone方法将 DateTime 对象修改为 UTC 时区。现在您有了 UTC 格式的用户日期时间,并且可以将该值存储在数据库中。使用日期时间format方法将数据表示为 MySQL 接受的格式的字符串。

因此,用户生成一个日期时间,然后您在用户指定的时区中创建一个 PHP 日期时间对象:

// 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')";

当您从数据库检索值时,以 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');

使用此方法,您的日期时间值始终以 UTC 形式存储在数据库内,并且用户始终体验其个人资料所在时区中的值。如果需要,PHP 将针对每个时区纠正夏令时。

一个问题:此解释不包括 MySQL 时间戳数据类型。我建议使用 MySQL 日期时间日期类型来存储日期时间值,而不是时间戳数据类型。手册中介绍了时间戳数据类型here.

Edit:您可以使用以下命令生成包含每个 PHP 时区字符串的数组列表标识符,它是 DateTimeZone 类的静态方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP Web 应用程序中使用时区 的相关文章

  • 暂停除了已激活的玩家之外的所有其他玩家。

    我有这个插件 它可以将不同的样式应用于 html5
  • PHP 中标头的使用

    非常简单的问题 这两个 PHP 版本 5 标头调用中哪一个是 最好的 header Not Modified true 304 header HTTP 1 1 304 Not Modified 我很确定第一个是最多价的 但只是好奇如果在 H
  • docker 中的 php Curl 冲突 CURLOPT_FILE 和 CURLOPT_RETURNTRANSFER

    当我使用curl时CURLOPT FILE and CURLOPT RETURNTRANSFER选项 文件为空 没有任何curl错误 fp fopen saveTo w ch curl init fileUrl curl setopt ch
  • Facebook PHP-SDK 页面刷新后似乎丢失了 userID

    我似乎登录工作正常 我可以登录 接受应用程序 第一次 然后显示用户信息 例如姓名 图片 等 然而 当我刷新页面时 userid 又回到 0 我必须再次登录 我不确定问题是什么 我必须在每次页面加载时重新启动它还是什么 我不知道 我会发布一些
  • Nginx 502 网关错误。通过增加buffer来解决。为什么?

    我正在设置 LEMP 堆栈来运行 Drupal 我安装了 Nginx 和 PHP FastCGI Nginx 工作正常 但任何运行 PHP 的尝试都会出现错误 502 Bad Gateway 谷歌很快发现 nginx 502 错误网关 ht
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • PHP 编码风格回归;在开关/外壳中

    我们正在尝试为我们的团队实施新的编码风格指南 当未找到 break 时 php codeniffer 会在 switch case 语句上打印警告 如下所示 switch foo case 1 return 1 case 2 return
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Jquery 数据表列总和

    我只是参考一下这个链接 https datatables net examples advanced init footer callback html了解如何获取 jquery 数据表中的列总计 但我已经完成了一半的项目 我在html页面
  • 字符串相似度的算法(比Levenshtein和similar_text更好)? php, Js

    在哪里可以找到比 levenshtein 和 phpimilar text 方法更准确地评估错误字符的拼写的算法 Example similar text jonas xxjon similar echo similar returns 6
  • PHP 中的 -> 和 :: 有什么区别?

    这个东西困扰我好久了 一直找不到 在 php 中使用 和 gt 之间的类有什么区别 让我举个例子 想象一个名为 MyClass 的类 该类中有一个函数 myFunction 使用有什么区别 MyClass myclass new MyCla
  • PHP session_regenerate_id 和黑莓浏览器

    问候 我正在开发一个登录系统 并陷入了黑莓浏览器身份验证的困境 他们似乎对 PHP 的 session regenerate id 有问题 有人可以建议替代方案吗 以下是身份验证和登录脚本 UPDATE看来会话一般都不起作用 拿出 sess
  • session_start():无法解码会话对象

    我有时在使用 CodeIgniter 时遇到以下问题 错误 2019 03 05 19 57 26 gt 严重性 警告 gt session start 无法解码会话对象 会话已被销毁 system libraries Session Se
  • 使用会话 php 创建 cookie?

    我使用会话来登录我网站中的用户 问题是 我想让用户remember密码 因此关闭 打开浏览器后他们不需要再次登录 我需要使用 cookie 和 session 来实现它吗 my code user POST user pass POST p
  • PHP 拒绝从 var_dump、print 等输出数据

    我目前正在运行 WAMP 服务器 并且在过去的 30 分钟内一直在尝试弄清楚我的项目如何以及为什么不会输出任何指定的 PHP 数据 起初我以为是因为我有一个 htaccess文件的output buffering被禁用 所以我删除了它 仍然
  • 如何在 PHP 5.6 中通过 php.ini 设置“verify_peer_name=false”SSL 上下文选项

    案例 我想打开 SSL 连接localhost而 SSL 证书是 FQDN 的问题 问题 没有进行特殊处理就行 下面的程序失败并显示以下消息 PHP Warning stream socket enable crypto Peer cert
  • PHPUnit - 模拟 S3Client 无法正常工作

    库 aws aws sdk php 2 PHP 版本 PHP 5 4 24 cli 作曲家 json require php gt 5 3 1 aws aws sdk php 2 require dev phpunit phpunit 4
  • HTML 锚点,禁用样式

    我有一些 html 锚链接代码 与文档的其余部分不同 我希望它看起来不是链接 有没有一种简单的方法可以禁用由于将文本包装在锚标记中而引起的样式更改 而不必强行使其相同 即 如果我更改正文字体样式 我不必也更改其他一些 link东西 将颜色设
  • 如何从日期中查找该月的最后一天?

    如何在 PHP 中获取该月的最后一天 Given a date 2009 11 23 我要2009 11 30 并给出 a date 2009 12 23 我要2009年12月31日 t返回给定日期所在月份的天数 请参阅的文档date ht
  • CSS溢出文本显示在几行中,没有断字

    我有一些长文本显示在 div 中 该 div 具有固定的宽度和高度 我希望文本显示在几行上 作为 div 高度 并且句子单词不会中断 一行中的单词前缀和下一行中的继续 此外 我想在末尾添加省略号最后一句话 CSS white space n

随机推荐

  • 使用 Spring Security 记录登录

    我想记录我的网络应用程序中的每次登录 我能够访问通过以下方式进行的登录UsernamePasswordAuthenticationFilter但我不知道如何记录使用记住我功能登录的用户 我尝试覆盖 createSuccessfulAuthe
  • 如何用 jquery 中使用的另一个字符替换“美元”符号?

    如何将 jquery 中使用的美元符号 jquery 的别名 更改为另一个字符 例如 id css height 210px 我想将其更改为 id css height 210px 你无法改变 to 因为 不是有效的标识符 但你可以将其更改
  • 即使设置了权限也无法写入 Android 外部存储

    在我使用 Xamarin Forms 的 Android 10 0 Q 应用程序中 我已在清单中正确设置
  • 在 Linux 上如何通过名称而不是 PID 来终止进程? [复制]

    这个问题在这里已经有答案了 有时 当我尝试启动 Firefox 时 它会显示 Firefox 进程已在运行 所以我必须这样做 jeremy jeremy desktop ps aux grep firefox jeremy 7451 25
  • 如何在 Perl 中构建独立于操作系统的文件路径(包括可选的 Windows 驱动器号)?

    我需要在 Perl 脚本内构建一个文件路径 我应该使用哪个路径分隔符来允许我的脚本在 Windows 和 Unix 上运行 请记住 Windows 需要驱动器号 你要文件 规格 s catpath catpath Takes volume
  • 用 Javascript 编写组合和排列计算器的最有效方法

    我有一个数学网站http finitehelp com教学生有限数学 我认为包含一个计算器会很酷 所以我制作了一个用于 Javascript 中的组合和排列的计算器 实时计算器位于http finitehelp com finite cal
  • pySpark forEachPartition - 代码在哪里执行

    我正在使用 2 3 版本的 pySpark 在我当前的开发系统中无法更新到 2 4 并且有以下关于对于每个分区 首先是一些背景信息 据我了解 pySpark UDFs强制 Python 代码在 Python 实例中的 Java 虚拟机 JV
  • Rails 中带有 jquery params 的 link_to

    我想在我的 Rails 应用程序中进行就地搜索 我使用了带有原型的button to remote 但现在我使用的是JQuery 所以我更改为link to 这是我的代码 我想将地址文本字段传递到我的控制器 但输出不是我所期望的 mycon
  • DataGridView设置行高不起作用

    尝试像这样设置 RowHeight 在代码中 dgvTruckAvail RowTemplate Height 48 不起作用 我还尝试设置我添加的每一列的高度 不起作用 这是网格属性 this dgvTruckAvail AllowUse
  • d3.js 使用多列从 csv 文件中过滤

    我想使用 csv 中的多个列值进行过滤 我首先想按城市过滤 然后按关键性列过滤 我想过滤重要性 高 中 低 如何使用 AND OR 进行过滤 City 和 Criticality 是复选框 根据我想要过滤相应 csv 列中的数据的选择 寻找
  • 如何在 32 位平台上调用 GetWindowLongPtr 和 SetWindowLongPtr?

    我想 P 调用获取窗口长指针 and 设置窗口长指针 并且我看到有关它们的相互矛盾的信息 有消息称 在 32 位平台上 GetWindowLongPtr 只是一个调用 GetWindowLong 的预处理器宏 并且 GetWindowLon
  • Java:如何设置 htmlunit

    我对 Java 是个菜鸟 但我想尝试一下 htmlunit 我使用 netbeans 作为 IDE 并创建了一个项目文件夹 hu1 以下是该文件夹的结构 hu1 gt nbproject gt src gt hu1 gt test 现在 我
  • 带有共享 ID 的 JPA @OneToOne —— 我可以做得更好吗?

    我正在使用一个我不想更改的现有架构 该架构在表 Person 和 VitalStats 之间具有一对一的关系 其中 Person 有一个主键 VitalStats 使用相同的字段作为 Person 的主键和外键 这意味着它的值是相应 PK
  • 如何处理 FirebaseAuthUserCollisionException

    我开始得到FirebaseAuthUserCollisionException当我尝试登录时出现异常Facebook in my Android应用 com google firebase auth FirebaseAuthUserColl
  • 如何将形状文件导入MySQL

    我需要将 shape 文件中的空间数据导入 MySQL 表中 我能够导入到 PostGreSQL 中 MySQL 的任何指针 我需要MySQL表中的数据 安装 FWtool 后尝试此操作 ogr2ogr f MySQL MySQL data
  • 为什么存在这些替代运算符表示

    考虑这些替代运算符表示 取自here Primary Alternative and and eq bitand bitor compl not not eq or or eq xor xor eq 为什么存在这些替代运算符表示 我喜欢它们
  • dplyr:在 mutate 命令中使用过滤器、group_by [重复]

    这个问题在这里已经有答案了 我想在数据表中添加一列 其中包含 y 的每个值除以 x 1 或 2 中相应条件的平均值 其中 x2 1 对于以下数据 其中 x 1 y 应除以 1 4其中 x 2 y 应除以 1 dt1 lt data tabl
  • Python:Rabin-Karp 算法哈希

    我为了好玩而实现 Rabin Karp 算法 我遇到了这个伪代码 RABIN KARP MATCHER T P d q 1 n T length 2 m P length 3 h d m 1 mod q 4 p 0 5 t 0 6 for
  • 测试rxjs的正确方法

    我把书带来了 rxjs 在行动 并完成测试部分 测试 rxjs 代码与通常的测试不同 因为一切都是延迟加载 在书中 他们提到了两种测试方法 要么传递完成 我正在使用 QUnit 完成信号异步代码已完成 要么传递大理石图 我的问题是 我应该选
  • 在 PHP Web 应用程序中使用时区

    我已经花了几个小时寻找在 PHP MySQL Web 应用程序中使用时区的最佳方法 但很难找到明确的答案 根据我到目前为止所学到的 最好将每个人的资料存储在 UTC 的数据库中 如果我错了 请纠正我 当用户注册时 我会询问他们所在的时区 然