用PHP将用户时区(世界上任何地方)与当前太平洋+一小时进行比较

用PHP将用户时区(世界上任何地方)与当前太平洋+一小时进行比较,php,validation,datetime,Php,Validation,Datetime,此项目包括创建一个表单,供用户输入促销的开始和结束时间。推广活动将在太平洋时区进行,创建推广活动的用户可能在世界任何地方 根据季节,开始时间必须比当前PST或PDT大一小时。当前验证开始时间的方法不起作用,因为它会提取用户计算机的本地时间 我需要一种方法来比较用户的本地时间和太平洋时间,并验证促销开始时间是否比太平洋时间长一小时 我的工作原理是找到用户的本地时间和格林威治标准时间之间的偏移量,然后找到当前太平洋时间和格林威治标准时间之间的偏移量,根据DST变化7或8小时,对吗?然后将这些偏移量应

此项目包括创建一个表单,供用户输入促销的开始和结束时间。推广活动将在太平洋时区进行,创建推广活动的用户可能在世界任何地方

根据季节,开始时间必须比当前PST或PDT大一小时。当前验证开始时间的方法不起作用,因为它会提取用户计算机的本地时间

我需要一种方法来比较用户的本地时间和太平洋时间,并验证促销开始时间是否比太平洋时间长一小时

我的工作原理是找到用户的本地时间和格林威治标准时间之间的偏移量,然后找到当前太平洋时间和格林威治标准时间之间的偏移量,根据DST变化7或8小时,对吗?然后将这些偏移量应用于用户的时间,并与太平洋时间加上1小时进行比较

我已经成功地找到了必要的偏移量,并以各种字符串和时间戳在太平洋时间中发出了正确的当前时间警报,但我无法理解总体逻辑。此外,我无法成功地将一小时添加到时间戳中

这个问题与其他许多问题类似,但在这种情况下,OP有一个固定的偏移量:

当前代码:

function valid() {
var starttime=$('#1-PromotionalSaleStartTime').val();
var endtime=$('#1-PromotionalSaleEndTime').val();
    var now = new Date();
    var hour= now.getHours();
    var min = now.getMinutes()+10;
    var nows= parseInt(hour)+1;
    var time=nows+':'+min;     
    var presentime = now.getHours()+':'+now.getMinutes()
    var month =now.getMonth()+1;
    var day = now.getDate();
    var output = (month<10 ? '0' : '') + month + '/' +(day<10 ? '0' : '') + day + '/'  + now.getFullYear() + ' '+time;
    var now    = (month<10 ? '0' : '') + month + '/' +(day<10 ? '0' : '') + day + '/'  + now.getFullYear() + ' '+presentime;
    var present    = new Date(now);
    var oneDay     = 24*60*60*1000;    // hours*min*sec*milliseconds
    var firstDate  = new Date(starttime);        
    var secondDate = new Date(endtime);
    var diffDays   = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    var diff       = Math.round(Math.abs(( present.getTime() - firstDate.getTime())/(oneDay)));
    var presentTimeStamp = +'<?php echo time(); ?>' * 1000;
    var firstDateTimeStamp = Date.parse($('#1-PromotionalSaleStartTime').val());

var err        = 0;


<?php if($this->add!="" && isset($this->add)) {?>

if(presentTimeStamp > firstDateTimeStamp) {
$('#1-PromotionalSaleStartTime').after('<ul class="errors"><li>Sorry, but you cannot add past date.</li></ul>');
        err++;
}


在服务器端尝试以下操作:

/* timetest.php */
<?php
if(isset($_POST['dateInfo'])){
  date_default_timezone_set('America/Los_Angeles'); $data = array();
  $dt = new DateTime;
  $pacificPlusOneOffset = dt->add(new DateInterval('P1D'))->getOffset();
  $data['diff'] = +$_POST['dateInfo']-$pacificPlusOneOffset;
  echo json_encode($data);
}
else{
  // could be some kind of hack
}
?>
/* timetest.php */
<?php
if(isset($_POST['dateInfo'])){
  date_default_timezone_set('America/Los_Angeles'); $data = array();
  $dt = new DateTime;
  $pacificPlusOneOffset = dt->add(new DateInterval('P1D'))->getOffset();
  $data['diff'] = +$_POST['dateInfo']-$pacificPlusOneOffset;
  echo json_encode($data);
}
else{
  // could be some kind of hack
}
?>
var pre = onload;
onload = function(){
if(pre)pre();
// more code to run other code here
function post(url, send, success){
  var x = new XMLHttpRequest || new ActiveXObject('Microsoft.XMLHTTP'), ec = [], s;
  for(var i in send){
    ec.push(encodeURIComponent(i)+'='+encodeURIComponent(send[i]));
  }
  s = ec.join('&').replace(/%20/g, '+'); x.open('POST', url);  
  x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  x.setRequestHeader('Content-length', s.length);
  x.setRequestHeader('Connection', 'close');
  x.onreadystatechange = function(){
    if(x.readyState === 4 && x.status === 200 && success){
      success(eval('('+x.responseText+')'));
    }
  }
  x.send(s);
}
post('timetest.php', {dateInfo:new Date().getTimezoneOffset()}, function(result){
  console.log(result.diff);
})
}