【问题标题】:How to manage timezone for different users of different countries for a php web application?如何为 php Web 应用程序管理不同国家的不同用户的时区?
【发布时间】:2014-08-17 00:59:16
【问题描述】:

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

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

但是当我检查帐户的到期日期时会出现问题。

例如-

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

【问题讨论】:

  • 15 天是 15 天,与时区无关。如果您的服务器注册了用户并记录了注册时间的时间戳,它还能够识别 15 天后的时间。你必须证明你是如何弄错的。
  • 谢谢,这适用于注册场景。但是,如果用户希望用户在提供的日期范围内报告某些记录,那么如何比较该用户时区的 MYSQL 查询中的日期?
  • 基本上:1) 知道用户在哪个时区(问他),2) 知道您将数据存储在哪个时区(UTC 很好,但只要它是一致的,任何工作都可以) , 3) 根据需要在两个时区之间进行转换。
  • 这真的取决于你想要什么。您的意思是在 15 个日历日过后的确切注册时间到期吗?还是在第 15 个日历日的结束?还是在 24 小时(360 小时)的 15 次间隔之后?您是否将用户的时区单独存储在数据库中?另外 - 请记住,并非所有日子都是 24 小时。在具有夏令时的时区中,过渡日为 23 或 25 小时。在一个时区 (Australia/Lord_Howe) 中,它们是 23.5 或 24.5 小时。
  • 在这里显示一些代码也会有所帮助。仅仅说你使用 strtotime 是不够的。请向我们展示一个示例,并提供数据值。另请参阅帮助中心的How to create a Minimal, Complete, and Verifiable example。谢谢。

标签: php mysql timezone


【解决方案1】:
/**
 * @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);
}

【讨论】:

    【解决方案2】:

    您需要执行几个步骤。

    • 沿其时区的所有国家/地区的数据库表
    • 在注册或提交表单时获取 IP 地址
    • 根据 IP 查看详细信息并获取国家和时区
    • 沿记录信息保存国家和时区

    通过这种方式,您可以沿其创建者的时区维护记录。

    就基于时区的过期记录而言,您可以根据其时区进行检查。

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

    【讨论】:

    • 但是我没有将他们的国家存储在数据库中,我认为维护IP、国家和时区的数据库并不好。并且用户不会总是从相同的 IP 地址登录。
    • 然后您可以根据服务器的时区(例如美国或英国时区)制作所有内容(过期的东西)。
    • 许多国家有多个时区。 IP 地理定位并不总是准确的,时区不仅仅是一个偏移量。抱歉,这是个糟糕的建议。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2016-02-07
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多