草庐IT

php - PHP 中带和不带 DST 的时区

coder 2024-05-03 原文

我读得越多,就越困惑。

我的项目计划是以 UTC 格式处理所有日期/时间存储和计算,但显示该数据时除外。问题是服务器将移动到具有不同时区和夏令时信息的不同位置,因此我必须在 UI 中实现某种形式的时区选择器。

但夏令时发生和不发生的地方都有各种异常(exception)情况,例如亚利桑那州没有夏令时,纳瓦霍印第安保留地除外。所以我不能简单地使用时区位置的 PHP 列表(例如“美国/凤凰城”),因为我不知道服务器的实际位置是否会在这样的区域,所以我猜我会必须实现一个显示“使用夏令时”的复选框和一个带有简单时区信息的更基本的选择框,例如“科委-6”等

我可以使用“America/Phoenix”系统来显示城市列表,但这会导致列表非常长。但是,如果我在我的列表中使用 EST/CST,对于有 DST 的区域和没有 DST 的区域来说,它是不准确的,所以我认为如果没有“DST?”我无法做到这一点。复选框。

但是,我刚刚尝试了 PHP 的 DateTimeDateTimeZone 以及 'CST'、'CDT' 和 'CST6CDT',这三个结果同时出现,两者二月的约会和六月的约会。我想,CDT应该带夏令时,CST应该不带夏令时,CST6CDT应该使用自动切换,但显然没那么简单……

所以...如果我使用 EST/CST/PST 等时区列表并希望能够通过复选框关闭 DST,我将如何在 PHP 代码中实现它?我如何告诉 PHP 将时间转换为正确的时区并支持打开或关闭 DST?

我知道这个的基本代码,但不知道如何更改夏令时:

$myTime = new DateTime('02/10/2013 08:00:00', new DateTimeZone('UTC'));
var_dump($myTime);  // UTC
$localTz = new DateTimeZone('America/Phoenix');  // selected by user
$myTime->setTimezone($localTz);
var_dump($myTime);  // Phoenix with local DST settings

关于不同但相关的说明,更改 Linux 服务器的位置是否会导致服务器的内部时钟更改时区?移动服务器是否会扰乱内部时钟并导致不正确的 UTC 时间戳?

最佳答案

作为一个花了 13 个月时间围绕此进行重大重构的人,我可以告诉你:你必须存储用户意图时间,然后将其解码为查看器本地时间

我所说的“用户意图时间”是时间和用户所在时区的组合。随着 DST 的变化,您将需要使用两种信息来解码为来自不同位置的用户显示的时间。我不只是指何时发生 Spring 和秋季转换 - 我的意思是当政府更改 DST 法律和更新 Olson tzdata 数据库时。

您确实有一个 cron 作业来经常从 PECL 更新 tzdata,对吧? :)

您会想要使用 - 并且可能会扩展 - PHP 有缺陷的 DateTime 和 DateTimeZone 内置函数。他们是您唯一的希望。

关于php - PHP 中带和不带 DST 的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17151584/

有关php - PHP 中带和不带 DST 的时区的更多相关文章

  1. ruby - 没有轨道的 ActiveRecord 时区 - 2

    我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A

  2. ruby - 将 Logstash 中的时间戳时区转换为输出索引名称 - 2

    在我的场景中,Logstash收到的系统日志行的“时间戳”是UTC,我们在Elasticsearch输出中使用事件“时间戳”:output{elasticsearch{embedded=>falsehost=>localhostport=>9200protocol=>httpcluster=>'elasticsearch'index=>"syslog-%{+YYYY.MM.dd}"}}我的问题是,在UTC午夜,Logstash在外时区(GMT-4=>America/Montreal)结束前将日志发送到不同的索引,并且索引在20小时(晚上8点)之后没有日志,因为“时间戳”是UTC。我们已

  3. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  4. ruby - Ruby Time#dst 如何运行? - 2

    这可能是一个愚蠢的问题,表明我对夏令时的基础知识缺乏了解,但根据标题,Time.dst?如何知道时间对象确实是真还是假?大概这必须通过日期和时区的组合来辨别,但这没有意义,因为时区中的低纬度不使用夏令时?因此肯定它必须需要位置来识别#dst??我错过了什么? 最佳答案 为了处理时区和夏令时,Ruby和其他所有东西一样,是callinglocaltime_rCfunction.这将时间放入名为tm的C结构中其中包括一个名为isdst的字段。Ruby正在读取该标志。localtime_r首先通过从全局tzname变量获取您的时区来计算i

  5. ruby - Ruby 中的 OptionParse 和不以 '-' 开头的参数 - 2

    我想要这样的参数:programdothis--additional--options和:programdothat--with_this_option=value我不知道该怎么做。我唯一能做的就是在开头使用带有--的参数。有什么想法吗? 最佳答案 要使用OptionParser处理位置参数,首先使用OptionParser解析开关,然后从ARGV中获取剩余的位置参数:#optparse-positional-arguments.rbrequire'optparse'options={}OptionParser.newdo|opts

  6. ruby-on-rails - 在 Ruby on Rails 中打印不带引号的字符串数组 - 2

    我需要在没有字符串引号的JavaScript中打印一个字符串数组。我有一个包含字符串值的数组,它作为嵌入到页面中。对于脚本,数组应该以[[value1]、[value2]、[value3]]等形式打印,但是当我输出数组时,它会在值周围添加引号,因此脚本不起作用。如何从输出中删除引号? 最佳答案 我不确定我是否理解正确,但是当输出数组时,你可以这样做:array=["value1","value2"]array.to_s.gsub('"','') 关于ruby-on-rails-在Ruby

  7. ruby - ruby 中带有多行字符串的空格 - 2

    我有一个多行字符串的空白问题。我在生成一些SQL的代码中有类似的内容。defgenerate_sql但是我的SQL缩进全乱了,这是我不想要的。"UPDATEpage\nSETview_count=10;\n"我能做到defgenerate_sql输出的正是我想要的"UPDATEpage\nSETview_count=10;\n"但是我的代码缩进全乱了,我真的不想要这样。关于如何最好地实现我所追求的目标有什么建议吗? 最佳答案 Ruby2.3.0使用squigglyheredoc很好地解决了这个问题.请注意示例之间波浪号/连字符的区别

  8. ruby-on-rails - Rails 中带后备功能的动态命名空间 Controller - 2

    我对新的Rails应用程序有一个有点奇怪的要求。我需要构建一个应用程序,其中所有路由都在多个命名空间中定义(让我解释一下)。我想要一个应用程序,其中学校科目(数学、英语等)是namespace:%w[mathenglish].eachdo|subject|namespacesubject.to_symdoresources:studentsendend这很棒而且有效,但它需要我为每个主题创建一个命名空间StudentsController,这意味着如果我添加一个新主题,那么我需要创建一个新Controller。我想创建一个Base::StudentsController,如果Math:

  9. ruby - 如何设置mysql2时区选项以删除查询警告 - 2

    使用mysql2做查询总是得到警告/usr/local/lib/ruby/gems/1.9.1/gems/mysql2-0.2.6/lib/active_record/connection_adapters/mysql2_adapter.rb:463:warning::database_timezoneoptionmustbe:utcor:local-defaultingto:local我确实看到了时区选项Mysql2现在支持两个时区选项::database_timezone-thisisthetimezoneMysql2willassumefieldsarealreadystored

  10. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

随机推荐