如何为不同国家的不同用户管理php web应用程序的时区?

如何为不同国家的不同用户管理php web应用程序的时区?,php,mysql,timezone,Php,Mysql,Timezone,我正在开发web应用程序。该应用程序具有来自不同国家/地区的不同用户 我曾经使用UTC时间戳管理他们的注册。这对我来说很好 但当我检查帐户的到期日时,问题出现了 比如说- 假设注册有效期为15天,来自印度的用户,其注册日期为2014年6月11日(根据亚洲/加尔各答时区),在数据库表中,我已将注册日期存储在Unix时间戳格式服务器中,设置为UTC时区,在第16天,我想让他的帐户过期,当我通过比较时间戳中的今天日期来执行查询时,使用PHP的strotime函数将日期转换为时间戳,我发现一天内有差异。

我正在开发web应用程序。该应用程序具有来自不同国家/地区的不同用户

我曾经使用UTC时间戳管理他们的注册。这对我来说很好

但当我检查帐户的到期日时,问题出现了

比如说-

假设注册有效期为15天,来自印度的用户,其注册日期为2014年6月11日(根据亚洲/加尔各答时区),在数据库表中,我已将注册日期存储在Unix时间戳格式服务器中,设置为UTC时区,在第16天,我想让他的帐户过期,当我通过比较时间戳中的今天日期来执行查询时,使用PHP的strotime函数将日期转换为时间戳,我发现一天内有差异。 如何处理这种情况?这不仅是注册问题,还有其他一些条件。
另外,如果我想使用cron job发送注册到期的电子邮件,它将如何工作?

您需要执行几个步骤

时区沿线所有国家的数据库表 在注册或表格提交时获取IP地址 根据IP检查详细信息并获取国家/地区和时区 沿记录信息保存国家/地区和时区 通过这种方式,您可以沿其创建者的时区维护记录

/**
 * @function getusertimezonedifference return timezone difference with UTC
 * @param integer $timezonedifference       optional
 * @return string time
 * @Comment Get User TimeZone Difference
 */
public function getusertimezonedifference($timezone = "Asia/Kolkata", $changetoUTC=false, $flg_array=false)
{
    #$timezone = "Asia/Kolkata";+5.30
    #$timezone = "America/Anchorage";-9
    #$timezone = "America/Los_Angeles";-8
    #$timezone = "America/Dawson_Creek";-8
    #$timezone = "America/Chicago";-6
    #$timezone = "America/New_York";-5
    #$timezone = "America/Halifax";-4
    #$timezone = "America/St_Johns";#3.30
    $dayLightFlag = false;
    $system_timezone = date_default_timezone_get();
    $local_timezone = "UTC";
    date_default_timezone_set($local_timezone);
    $local = date("Y-m-d H:i:s");
    date_default_timezone_set("GMT");
    $gmt = date("Y-m-d H:i:s");
    date_default_timezone_set($timezone);
    $required = date("Y-m-d H:i:s");
    date_default_timezone_set($system_timezone);
    $diff1 = (strtotime($gmt) - strtotime($local));
    $diff2 = (strtotime($required) - strtotime($gmt));
    if($changetoUTC) {$diff2 =  (-1*$diff2);}
    // extract hours
    $hours = floor($diff2 / (60 * 60));
    // extract minutes
    $divisor_for_minutes = $diff2 % (60 * 60);
    $minutes = floor($divisor_for_minutes / 60);
    // extract the remaining seconds
    $divisor_for_seconds = $divisor_for_minutes % 60;
    $seconds = ceil($divisor_for_seconds);

    //create string HH:MM:SS
    $ret = $hours.":".(($minutes>9)?$minutes:"0$minutes").":".(($seconds>9)?$seconds:"0$seconds");
    if($flg_array){$ret = array($hours, ((abs($minutes)>9)?$minutes:"0$minutes"), ($seconds>9)?$seconds:"0$seconds");}
    return ($ret);
}
至于基于时区的过期记录,则可以基于其时区进行检查

/**
 * @function getusertimezonedifference return timezone difference with UTC
 * @param integer $timezonedifference       optional
 * @return string time
 * @Comment Get User TimeZone Difference
 */
public function getusertimezonedifference($timezone = "Asia/Kolkata", $changetoUTC=false, $flg_array=false)
{
    #$timezone = "Asia/Kolkata";+5.30
    #$timezone = "America/Anchorage";-9
    #$timezone = "America/Los_Angeles";-8
    #$timezone = "America/Dawson_Creek";-8
    #$timezone = "America/Chicago";-6
    #$timezone = "America/New_York";-5
    #$timezone = "America/Halifax";-4
    #$timezone = "America/St_Johns";#3.30
    $dayLightFlag = false;
    $system_timezone = date_default_timezone_get();
    $local_timezone = "UTC";
    date_default_timezone_set($local_timezone);
    $local = date("Y-m-d H:i:s");
    date_default_timezone_set("GMT");
    $gmt = date("Y-m-d H:i:s");
    date_default_timezone_set($timezone);
    $required = date("Y-m-d H:i:s");
    date_default_timezone_set($system_timezone);
    $diff1 = (strtotime($gmt) - strtotime($local));
    $diff2 = (strtotime($required) - strtotime($gmt));
    if($changetoUTC) {$diff2 =  (-1*$diff2);}
    // extract hours
    $hours = floor($diff2 / (60 * 60));
    // extract minutes
    $divisor_for_minutes = $diff2 % (60 * 60);
    $minutes = floor($divisor_for_minutes / 60);
    // extract the remaining seconds
    $divisor_for_seconds = $divisor_for_minutes % 60;
    $seconds = ceil($divisor_for_seconds);

    //create string HH:MM:SS
    $ret = $hours.":".(($minutes>9)?$minutes:"0$minutes").":".(($seconds>9)?$seconds:"0$seconds");
    if($flg_array){$ret = array($hours, ((abs($minutes)>9)?$minutes:"0$minutes"), ($seconds>9)?$seconds:"0$seconds");}
    return ($ret);
}

假设我在巴基斯坦,时区是5+。所以到期步骤也应该遵循我的时区

无论时区如何,15天都是15天。如果您的服务器注册了用户并记录了其注册时间戳,那么它还能够识别15天后的时间戳。你必须展示你是如何做到这一点的。谢谢,这将适用于注册场景。但是,如果用户希望报告用户提供的日期范围内的某个记录,那么如何在MYSQL查询中比较该用户时区的日期?基本上:1知道用户所在的时区问他,2知道您在UTC中存储数据的时区是好的,但只要是一致的,3根据需要在两个时区之间转换。这取决于你想要什么。您的意思是在15个日历日之后在注册的确切时间过期吗?还是在第15个日历日结束时?还是在每隔15天24小时360小时之后?您的数据库中是否单独存储了用户的时区?另外,请记住,并非所有的日子都是24小时。在有夏令时的时区中,过渡日为23或25小时。在一个时区澳大利亚/洛德豪,他们是23.5或24.5小时。显示一些代码在这里也会有所帮助。仅仅说你使用strotime是不够的。请给我们举个例子,并提供数据值。另请参见帮助中心中的。谢谢。但我没有把他们的国家存储在数据库中,我认为维护IP、国家和时区的数据库是不好的。而且用户不会总是从同一IP地址登录。然后您可以根据服务器的时区(如美国或英国时区)使所有内容过期。许多国家都有多个时区。IP地理定位并不总是准确的,时区不仅仅是一个偏移量。对不起,这是个坏建议。
/**
 * @function getusertimezonedifference return timezone difference with UTC
 * @param integer $timezonedifference       optional
 * @return string time
 * @Comment Get User TimeZone Difference
 */
public function getusertimezonedifference($timezone = "Asia/Kolkata", $changetoUTC=false, $flg_array=false)
{
    #$timezone = "Asia/Kolkata";+5.30
    #$timezone = "America/Anchorage";-9
    #$timezone = "America/Los_Angeles";-8
    #$timezone = "America/Dawson_Creek";-8
    #$timezone = "America/Chicago";-6
    #$timezone = "America/New_York";-5
    #$timezone = "America/Halifax";-4
    #$timezone = "America/St_Johns";#3.30
    $dayLightFlag = false;
    $system_timezone = date_default_timezone_get();
    $local_timezone = "UTC";
    date_default_timezone_set($local_timezone);
    $local = date("Y-m-d H:i:s");
    date_default_timezone_set("GMT");
    $gmt = date("Y-m-d H:i:s");
    date_default_timezone_set($timezone);
    $required = date("Y-m-d H:i:s");
    date_default_timezone_set($system_timezone);
    $diff1 = (strtotime($gmt) - strtotime($local));
    $diff2 = (strtotime($required) - strtotime($gmt));
    if($changetoUTC) {$diff2 =  (-1*$diff2);}
    // extract hours
    $hours = floor($diff2 / (60 * 60));
    // extract minutes
    $divisor_for_minutes = $diff2 % (60 * 60);
    $minutes = floor($divisor_for_minutes / 60);
    // extract the remaining seconds
    $divisor_for_seconds = $divisor_for_minutes % 60;
    $seconds = ceil($divisor_for_seconds);

    //create string HH:MM:SS
    $ret = $hours.":".(($minutes>9)?$minutes:"0$minutes").":".(($seconds>9)?$seconds:"0$seconds");
    if($flg_array){$ret = array($hours, ((abs($minutes)>9)?$minutes:"0$minutes"), ($seconds>9)?$seconds:"0$seconds");}
    return ($ret);
}