PHP服务器时间落后于当地时间

时间:2018-01-03 16:46:40

标签: php magento time

我的服务器时间超过当地时间(我无法更改服务器时间)约4小时。服务器托管在不同的时区,改变服务器时间会对太多其他事情产生太多影响。

无论如何,我有客户订购礼品卡,礼品卡的日期是在他们订购的同一天寄出,因此礼品卡上的日期戳是(例如),1/3/201。

但是,让我们说他们在晚上11:30放置礼品卡订单,服务器时间已经转移到1/4/2018。我在下面的代码没有考虑到这一点:

$curDate  = date('Y-m-d');
if ($card->getCardStatus() == 0){
    if ((($card->getMailDeliveryDate() == null) || ($curDate == $card->getMailDeliveryDate())) && $card->getCardType() != 'offline') {
        $card->setCardStatus(1);
        $card->save();
        $card->send();
    }
}

有关如何考虑此方案的任何想法?

谢谢。

编辑 一个男人,我的问题被扭转了。我的当地时间早于我的服务器时间。我道歉。我的Magento设置为东部时间(我在那里),但服务器本身位于洛杉矶,因此PST。我不想改变时区,我只是想确保在其他时区放置订单。

1 个答案:

答案 0 :(得分:3)

这是PHP date_default_timezone_set()功能的步骤。

  

date_default_timezone_set - 设置脚本中所有日期/时间函数使用的默认时区

像这样设置default_timezone

date_default_timezone_set('America/Los_Angeles');

更多http://php.net/date-default-timezone-set

编辑:根据@RamKesavan的建议,您还可以通过以下方式在Magento settings中设置时区:

  • 首先将global timezone设置为GMTUTC

    1。)转到系统 - >设置

    2.)编辑默认范围

    3.)转到配置 - >一般 - >一般 - >区域设置选项

    4.。)选择GMT标准时间(或UTC)

  • 然后您需要将default website scope设置为preferred time zone,如下所示:

    1。)转到系统 - >设置

    2。)选择每个网站的范围。

    3.)转到配置 - >一般 - >一般 - >区域设置选项。

    4.。)选择W.欧洲标准时间(欧洲/柏林或欧洲/阿姆斯特丹)或选择适合您客户所在地的其他时区。

    5.)重复下一个网站。

  

default website scope将确保您的网站显示荷兰,中国或美国的订单和发货时间,或根据您的设置显示其他时间。

更多https://support.hypernode.com/magento-utc-hypernode

编辑2:(OP改变了问题)

无法从服务器端(PHP)准确地检测用户日期时间区域设置。这就是客户端(javascript)的用途。

有一个javascript脚本jstimezonedetect可用于轻松检测用户时区设置。下载脚本并将其包含在您拥有purhase form

的页面中

要检索timezone并使用purchase form发送,您可以在hidden field内添加purchase form(它将随表单一起发送),如下所示:< / p>

var tz = jstz.determine(); // call the jstimezonedetect script object
var tzName = tz.name();    // name of the user timezone 'Europe/Berlin'
var hiddenTimezone = document.getElementById('myHiddenTimezone');
hiddenTimezone.value = tzName;  // add timezone value to hidden field

HTML中,您需要在hidden element内添加purchase form,如下所示:

<form ...>
  // ...
  // ...
  <input type="hidden" id="myHiddenTimezone" name="userTimezone" value="" />
  <!-- since the hidden element is inside the form and has a name -->
  <!-- it will be sent with the form -->
  // ...
</form>

server side(接收方),您会得到timezone,如下所示:

$userTimezone = $_POST['userTimezone'];  // or $_GET['userTimezone'] if form method was GET

purchase出现时,您现在拥有server timeuser timezone。您可以在表格中创建3列。一个用于server time,另一个用于user time zone,第三个用于current (calculated) user time

然后,您可以提取您希望的任何列,并确定您从数据库中获得了什么,以及如何编写PHP function来处理它。

编辑3:

要简单地将日期从例如PST转换为EST,您可以这样做:

$ESTDate = new DateTime('2017-02-04 12:32:43', new DateTimeZone('America/Los_Angeles'));
$ESTDate->setTimezone(new DateTimeZone('America/New_York'));

如果您希望echo datetime格式化:

echo $ESTDate->format('Y-m-d H:i:s');

如果您希望与可以使用的其他日期进行比较:

$difference = $ESTDate1->diff($ESTDate2);

将产生如下结果:

DateInterval Object
(
  [y] => 3
  [m] => 5
  [d] => 15
  [h] => 0
  [i] => 0
  [s] => 0
  [invert] => 0
  [days] => 1264
)

// usage
if($difference['days'] == 0)
// ...

或者您可以使用> <和其他类似的运算符:

// both dates must be in the same format (example: 'Y-m-d h:i:s')
if( $ESTDate1 > $ESTDate2)  // date1 is greater
else                        // date2 is greater or equal