【问题标题】:Datetime Calculation in PHPPHP中的日期时间计算
【发布时间】:2013-01-07 05:37:32
【问题描述】:

我陷入了 php 中时间计算的问题。我会用我的例子告诉你:

我在网络服务器上托管了一个问候网站,该服务器位于印度。这意味着服务器在印度时区运行。现在让我们认为今天的日期是 '01/01/2013',我想在第二天 02/01/2013 的早上 0:00 AM (12:00 AM) 向英国发送问候。如果我提交我的贺卡,我的 php 脚本将按印度时区发送这张贺卡,这意味着当印度上午 12 点时,脚本将运行并发送贺卡,英国将在确切时间前 5 小时收到这张贺卡。我知道如何获得我使用时间偏移来获得时间的任何国家的正确时间。

$time = strtotime('H:m:s'.(time() - (serverOffset - ukOffset)))

那么将时间设置为 00:00AM 或当前时间剩余多少小时到 00:00AM 的方法是什么。有什么手续吗?

[新更新]

好的,我知道了

$SERVER_OFFSET = 19800; //INDIA +5.50
$PARIS_TZ_HOUR = 1.0; //FRANCE-PARIS +1.00
$NEW_OFFSET = ($PARIS_TZ_HOUR * (60*60)); //new_offset 3600
$MINUTES = ($SERVER_OFFSET - $NEW_OFFSET)/60; 

// Lets date is: 2013-01-20 00:00:00
echo date('Y-m-d H:i:s', strtotime($MINUTES.'minutes', strtotime('2013-01-19')));  

简单的话:
(19800-3600)/60 = 270(分钟)

270 分钟,即 4.5 小时
那么印度时间什么时候会 2013-01-20 00:00
然后它将在法国 2013-01-19 19:30:00

如果印度时间是 2013 年 1 月 20 日 04:30,那么法国时间是 2013 年 1 月 20 日 00:00 :)
我使用分钟而不是添加小时,因为分钟会给你更准确的结果,而不是小时。

就是这样,希望对大家有所帮助

【问题讨论】:

  • 如果您发现以下任一解决方案有帮助,请将其标记为答案。
  • 好的,抱歉我没有更新这个..检查这个解决方案有问题的细节

标签: php datetime timezone


【解决方案1】:

您始终可以像这样使用 date_default_timezone_set() 设置时区:

date_default_timezone_set('Europe/London');

但如果您不想这样做,您可以通过执行以下操作来获取 00:00am (12am) 的时间戳:

$ukOffset = 60*60*5.5; // UK is 5 hours 30 mins behind India's time
$midnight = strtotime('7 January 2013');
$midnightUK = $midnight-$ukOffset;

或者,如果您想查看从现在到那时还剩多少时间,您可以执行以下操作:

$ukOffset = 60*60*5.5;
$midnight = strtotime('7 January 2013');
$midnightUK = $midnight-$ukOffset;
$difference = $midnightUK - (time()-$ukOffset);

【讨论】:

  • 实际上我不能使用 date_default_timezone_set,因为正如我所说,我正在创建电子问候网站,我将使用 CRONJOB 作为我的问候发送者,我的数据库将包含混合国家数据,我想计算日期然后将其保存在我的数据库中。意思是,根据服务器时间转换另一个国家/地区时间,当服务器时间为 5:00(IST)时,英国时间将为 00:00(12AM)...抱歉英语不好:P 你可以理解我想要的说....无论如何我会尝试您的代码并回复您。
  • 对不起,我不知道设置时区是否适合您,但我想我还是会继续建议它,因为如果它有效,它将为您节省很多的代码。如果您需要更多帮助,请告诉我,我很乐意为您提供帮助。
  • 谢谢你,当我解决了我的问题后,我会在这里发布方法,这对其他人也有帮助。 ;)
  • 如果我的回答对您有帮助,请点击 ^ 箭头或箭头下方的复选标记投票或接受。谢谢!
  • 如果您使用 60*60*5.5 这样的日期算术,您可能会遇到 DST 问题。请改用strtotime
【解决方案2】:

在 PHP 中,有不止一种方法可以实现您的目标。

1) 如果你是专门找英国的,可以使用gmdate函数。 http://php.net/manual/en/function.gmdate.php

2) 使用 DateTime 类的 setTimezone 方法。 http://php.net/manual/en/datetime.settimezone.php

3) 使用 date_default_timezone_set 方法。 http://php.net/manual/en/function.date-default-timezone-set.php

您会在 php 在线手册中找到很好的示例,并且 2) 和 3) 都应该有助于您设置任何可能的时区并在指定时间触发事件。

【讨论】:

    【解决方案3】:

    为什么不在卡片脚本中设置运行时要使用的时区?

    在脚本的顶部...

    date_default_timezone_set('Europe/London');
    

    【讨论】:

      【解决方案4】:

      假设您的服务器比所需时区晚 5 小时,您可以这样做。

      $date = date('h:i:s A', strtotime($today)+(60*60*5)); // $today is today date
      

      【讨论】:

      • 英国实际上比印度晚 5 小时 30 分钟,而不是 5 小时。
      【解决方案5】:

      使用 PHP 的 DateTime 类可以解决这个问题。我设置了这段代码来演示:-

      date_default_timezone_set('Asia/Kolkata');//As my dev machine is on GMT, you probably don't need this.
      $date = new DateTime();
      var_dump($date);
      $date->setTimezone(new DateTimeZone('Europe/London'));
      var_dump($date);
      

      输出:-

      object(DateTime)[1]
        public 'date' => string '2013-01-07 19:44:08' (length=19)
        public 'timezone_type' => int 3
        public 'timezone' => string 'Asia/Kolkata' (length=12)
      object(DateTime)[1]
        public 'date' => string '2013-01-07 14:14:08' (length=19)
        public 'timezone_type' => int 3
        public 'timezone' => string 'Europe/London' (length=13)
      

      基本上,这表明您可以将服务器时间直接与英国时间进行比较,以便在正确的时间发送消息。

      请参阅DateTimeDocs manual 了解更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-07
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        相关资源
        最近更新 更多