【问题标题】:filter dates in php in accordance with timezone selected from UI根据从 UI 中选择的时区过滤 php 中的日期
【发布时间】:2019-08-26 18:36:36
【问题描述】:

我正在编写如下所示的 php 代码,其中包含我想要更改的 air_date 当从 UI 中选择不同的时区时。

PHP代码:

$cols = array(
    'e.description_' . $opp_lang . ' as translation',
    's.air_date',  // This is the entry point of air_date and its been used everywhere. 
    'e.program_id',
); 

我用于时区的逻辑:

function tz_translations( $lang = 'en' ) {
    $tz_translations = [
        'en' => [
            'PST' => [
                'label' => 'PT',
                'diff'  => 'subtract 3 hours',
            ],
            'EST' => [
                'label' => 'ET',
                'diff'  => 'subtract 0 hours',
            ],
        ],
        'fr' => [
            'HNP' => [
                'label' => 'HP',
                'diff'  => 'subtract 3 hours',
            ],
            'HNE' => [
                'label' => 'HE',
                'diff'  => 'subtract 0 hours',
            ],
        ],
    ];

    return $tz_translations[ $lang ];
}   

用户界面(JS代码):

<ul id="js-timezone-picker">
   <?php foreach ( $tz_translations as $key => $tz ) :
      $tz_param = strtolower( $tz['label'] );
      $active = ( $current_tz === $key ) ? 'active' : '';
      ?>
   <li>
      <button id="<?php echo esc_attr( 'js-time-' . $tz_param ) ?>"
         class="<?php echo sanitize_html_class( $active ) ?>"
         data-timezone="<?php echo esc_attr( $tz_param ) ?>"><?php echo esc_html( $tz['label'] ) ?></button>
   </li>
   <?php endforeach; ?>
</ul>

When PT/ET is selected then it becomes the following on inspect:

<button id="js-time-pt" class="" data-timezone="pt">PT</button>
<button id="js-time-et" class="" data-timezone="et">ET</button>

问题陈述:

我想知道我应该在上面的 php 代码中进行哪些更改,以便当 从 UI/JS 代码中选择不同的时区时,air_date在 php 代码中会根据时区自动更改。

【问题讨论】:

  • 你好。 “我应该做出哪些改变”是一个过于宽泛的问题。相反,请尝试将您的问题限制在特定问题上。请阅读帮助中心的How do I ask a good question?。此外,您应该阅读timezone 标签中的其他问题,以及the timezone tag wiki 和PHP's DateTime documentation,其中包括时区。
  • 请注意,您需要使用America/New_York 等实际时区标识符,而不是ET。您也不能简单地应用像 'subtract 3 hours' 这样的差异,因为这不考虑夏令时和其他时区的奇怪情况。
  • @MattJohnson 我试图提供最大的信息。好的,我会尽量减少我的问题
  • 你读过Timezone conversion in php吗?很难判断你是否要求其他任何东西。
  • “过滤日期”到底是什么意思? s.air_date 的值是多少?一个约会?采用什么格式 - 是否始终采用这种格式?

标签: javascript php html user-interface timezone


【解决方案1】:

你的问题不好回答。对我来说,不清楚你的代码是如何组合在一起的,或者它们究竟代表什么。因此,我认为最好从一些通用的实用定义开始。

内部时区

“内部时区”是您在 PHP 代码、数据库、服务器等内部使用的时区。到处。你需要选择一个。最合乎逻辑的选择是 UTC,但任何其他区域都可以,只要您坚持它。拥有一个内部时区意味着您永远不必从一个时区到另一个时区进行任何转换。

外部时区

“外部时区”是您用来向访问者显示日期和时间的时区。正如您正确假设的那样,外部时间是您内部时间的一种转换,但有所不同。此转换应由应用程序的表示层进行。因此,只有在可能的最晚时刻,内部时间才会转换为外部时间。

用 PHP 转换

您可以在 Javascript 中将时间从一个区域转换为另一个区域,但您为什么要这样做呢?时间应该由 PHP 提供,可以使用服务器时间,也可以使用数据库中的字段,因此使用 PHP 进行从内部时间到外部时间的转换是有意义的。

这意味着您需要以一种易于从 PHP 中访问的方式存储由用户使用漂亮的 UI 选择的时区。最常见的方法是store it in a session。这通常使用an AJAX call from Javascript 到 PHP 后端来完成。 JQuery 可以让 AJAX 的使用变得简单。

其他人在cmets中说,最好use existing time zone values。当然,仅供内部使用。如何向用户显示时区取决于您。

所以让我们开始编写一些代码。让我们假设内部时间是 UTC,并且您有一个内部时间字符串,例如来自您的数据库:

$internalTimeStr = '2019-04-12 13:33:20';

很容易将其转换为 PHP 可以使用的时间:

$internalTime = strtotime($internalTimeStr);

反之亦然:

$internalTimeStr = date('Y-m-d H:i:s', $internalTime);

现在假设您网站的访问者在 UI 中选择了“America/New_York”来表示东部时间。您可以使用此选项将内部时间转换为外部时间。

function utc2local($utc,$localTimezone)
{
    $dt = new DateTime($utc);
    $dt->setTimezone(timezone_open($localTimezone));
    return $td->getTimestamp();
}

// we know this
$externalTimezone = 'America/New_York';     // from session / UI
$internalTimeStr  = '2019-04-12 13:33:20';  // from database / system
// and this is the conversion
$internalTime     = strtotime($internalTimeStr);
$externalTime     = utc2local($internalTime,$externalTimezone);
$externalTimeStr  = date('Y-m-d H:i:s', $externalTime);

重要的是要认识到这种转换可以通过多种方式实现,这只是一个例子。在使用之前,请确保代码符合您的要求。

使用 PHP 内置的函数的原因是 时间很困难,really difficult。

现在您可以使用此外部时间向访问者显示时间。

结论

这可能并不完全符合您的预期,但我希望它能给您一些好的指导。使用会话和 AJAX 调用是您必须自己找出的问题,这超出了这个问题的范围。如果您有任何具体问题,您可以随时提出另一个问题。但请尝试在一个问题中处理一个特定问题。

【讨论】:

    【解决方案2】:

    如果它只是一个转换并且您不需要其他服务器信息,您应该将所有数据传递到客户端(例如通过 json 格式),然后使用按钮触发一个 Javascript 函数来执行您的特定转换。 但是如果您需要更改 php 对象,您需要一个服务器请求(get、post 或 Ajax)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多