我的服务器时间超过当地时间(我无法更改服务器时间)约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。我不想改变时区,我只是想确保在其他时区放置订单。
答案 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
设置为GMT
或UTC
:
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 time
和user 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