欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Magento秒杀活动那么些破事

程序员文章站 2024-01-23 18:26:04
...

年底了各种活动都要上线了,什么黑五、感恩。圣诞、万圣那个密集。一般会做秒杀活动,如果你只是做国内那么本文没有太大的价值。

需求如下:需要在2019.11.29 00:00:00 - 2019.11.29 00:30:00 启动一次秒杀活动。

服务器是在洛杉矶的,所以它的时区是西八区。如果不是你需要校准服务器时间,否则你懂得。

活动页面一般没什么复用性,所以我们新建一个phtml

接下来我们需要知道服务器当前时间,打印出来发现好像没什么问题,其实这里有个坑你要是不注意那么你的活动可能一个人也参加不了。

$currentTime = strtotime(date("Y-m-d H:i:s",time()))

上面的代码确实是打印出时间了,但是并不是服务器当前的时间;怎么解呢?我们把代码改造下:动态设置时区然后在获取时间就是服务器当前的时间了。

    $timeZone = empty($this->getTimezone()) ? 'America/Los_Angeles' : $this->getTimezone();

    date_default_timezone_set($timeZone);//设置时区否则时间不准

    $currentTime = strtotime(date("Y-m-d H:i:s",time()));//Mage::getModel('core/date')->timestamp(time());

然后再动态获取活动开始时间跟结束时间跟服务器当前时间对比就可以知道当前是活动未开始、活动进行中、活动已结束。具体做法就是新建一个页面,页面里面放一个block动态设置,差不多如下:

Magento秒杀活动那么些破事

 

既然是秒杀,页面上少不了倒计时,这个js代码网上很多,都大同小异,但是这里也有个坑,如果你只是国内使用是无所谓的,因为中国就一个时区。但是是多国那么这里我们就需要把当前客户端时间换算成服务器所在的时区时间了,否则就会出现明明活动还没开始你的网页上却已经结束了。因为我们比美国快1天啊。转换代码如下:

getLocalTime: function (i, d) {
		    //参数i为时区值数字,比如北京为东八区则输入+8,西5输入-5
			//参数d为要转换的时间(Date类型)
		    if (typeof i !== 'number') return;
		    var len = d.getTime();
		    //本地时间与GMT时间的时间偏移差
		    var offset = d.getTimezoneOffset() * 60000;
		    //得到现在的格林尼治时间
		    var utcTime = len + offset;
		    return new Date(utcTime + 3600000 * i);
		}

this.getLocalTime(this.options.timeZoom,new Date)

这样不在时区内的用户也能准时参加活动了。

相关标签: 秒杀计时