【问题标题】:Codeigniter API: How to get data from mysql database based on users timezone in a Codeigniter API?Codeigniter API:如何根据 Codeigniter API 中的用户时区从 mysql 数据库中获取数据?
【发布时间】:2021-05-26 09:50:07
【问题描述】:
  • 我希望显示 GMT 0 今天的数据用户时区。

  • 我想根据多个时区从 mysql 获取数据。我在数据库中有一个 GMT 0 数据。在我的应用程序中,全球有多个用户。所以我想根据用户时区明智地调用数据。

  • 我通过 GMT 0 时区从数据库中获取数据,然后将该数据转换为特定用户时区。我主要想要亚利桑那时区,所以它是 GMT-7。当我得到今天的数据时,用户明智的问题是,当 GMT 0 和 GMT-7 日期相同时,结果显示不同,如果日期不同,则结果正确

  • 我附上了获取今天调用图表数据的 Codeigniter API 代码。因此,如果您有任何解决方案,非常欢迎您的想法。

     <!-- Default timezone is UTC(GMT) 0 -->
     public function __construct()
     {
         date_default_timezone_set('UTC');
     }
    
     <!-- Controller API get todays calls by user current timezone -->
     public function getChartNumberOfCalls($company_uuid,$timezoneid){
         if($_SERVER['REQUEST_METHOD']=='OPTIONS'){
             return json_encode('OK');
         }
         $request_body = file_get_contents('php://input');
    
         $filterhrs = $this->api_model->convert_to_GMT($startdate,1,$timezoneid);
    
         $currdate = $this->api_model->display_to_GMT(date('Y-m-d H:i:s'),1,$timezone1);
         $NumberOfCalls = $this->api_model->getChartNumberOfCalls($company_uuid,$currdate);
    
         $calls = array();
           $hrsarr = array();
           $keyhrsarr = array();
           foreach ($NumberOfCalls as $key => $value) {
             if($value['month']<10)
             $value['month'] ='0'.$value['month'];
             if($value['Hours']<10)
             $value['Hours'] ='0'.$value['Hours'];
             $convertdate = $value['year'].'-'.$value['month'].'-'.$value['day'].' '.$value['Hours'].':00:00';
             $date =  $this->api_model->display_to_GMT($convertdate,1,$timezone1);
             $calls[$key]['date'] = $date;
             $keyhrsarr[date('H',strtotime($date))]['keydate'] = date('H',strtotime($date));
             $keyhrsarr[date('H',strtotime($date))]['usage'] = $value['usage'];
             $calls[$key]['usage'] = $value['usage'];
             $calls[$key]['hrs'] = date('H',strtotime($date));
             $hrsarr[$key] = date('H',strtotime($date));
           }
    
           $arr = array();
           $iTimestamp = strtotime($filterhrs);
           $j = 0;
           $newdatepre='';
           for ($i = 0; $i <= 23; $i++) {
               $hrs = date('Y-m-d H:i:s', $iTimestamp);  
               $hrs = $this->api_model->display_to_GMT($hrs,1,$timezone1);
               $hrs = date('H', strtotime($hrs));  
               if(in_array($hrs,$hrsarr)){
                 $arr[] = (int)@$keyhrsarr[$hrs]['usage'];               
              }else{
                 $arr[] = 0;   
               }
               $j++;
               $iTimestamp += 3600;
           }
          $arr1['data'] = $arr;
          $this->output
                 ->set_content_type('application/json')
                 ->set_output(json_encode($arr1['data']));
     }
    
     <!-- Model Code query to get calls data by current date  -->
     public function getChartNumberOfCalls($company_uuid,$currdate){
         if(date('Y-m-d')==date('Y-m-d',strtotime($currdate))){
             $start_date = date('Y-m-d 00:00:00');
             $end_date = date('Y-m-d H:i:s');           
         }else{
             $start_date = date('Y-m-d H:i:s', strtotime('-1 day'));
             $end_date = date('Y-m-d H:i:s');
         }
    
         $sql =$this->db->query("SELECT HOUR(start_stamp) AS Hours,day(start_stamp) AS day,month(start_stamp) AS month,year(start_stamp) AS year,COUNT(*) AS `usage` FROM calls WHERE (start_stamp BETWEEN '".$start_date."' AND '".$end_date."') and company_uuid='".$company_uuid."' GROUP BY HOUR(start_stamp), day( start_stamp ) ORDER BY start_stamp desc");
    
         return $sql->result_array();
       }
    
    
    
       <!-- Convert GMT 0 to current timezone -->
       function display_to_GMT($convertdate,$offset,$timezone_id){
             $this->db->select('gmtoffset');
             $this->db->from('timezone');
             $this->db->where('id',$timezone_id);
             $query = $this->db->get();
             $timezone_offset = $query->result();
    
             $USER_GMT = $timezone_offset['0']->gmtoffset;
             // echo $USER_GMT;exit;
             // $USER_GMT = '19800'; // 5:30 Indian Timezone
             $SERVER_GMT='0';
             $date_time_array = getdate(strtotime($convertdate));
             $hours = $date_time_array['hours'];
             $minutes = $date_time_array['minutes'];
             $seconds = $date_time_array['seconds'];
             $month = $date_time_array['mon'];
             $day = $date_time_array['mday'];
             $year = $date_time_array['year'];
             $timestamp = mktime($hours, $minutes, $seconds, $month, $day, $year);
             $timestamp = $timestamp+($USER_GMT-$SERVER_GMT);
             // echo $convertdate.'===='.$timestamp;exit;
             // $date = date("Y-m-d H:i:s", $timestamp);
             if ($offset == 1) {
               $date = date( "Y-m-d H:i:s", $timestamp );
             } else {
               $date = date( "Y-m-d", $timestamp );
             }        
             return $date;
           }
    
          <!-- Convert current timezone to GMT 0  -->
           function convert_to_GMT($currDate, $fulldate = 1, $timezone_id = '') {
             $SERVER_GMT = '0';
             $this->db->select('gmtoffset');
             $this->db->from('timezone');
             $this->db->where('id',$timezone_id);
             $query = $this->db->get();
             $timezone_offset = $query->result();
    
             $USER_GMT = $timezone_offset ['0']->gmtoffset;
    
             $date_time_array = getdate ( strtotime ( $currDate ) );
             $hours = $date_time_array ['hours'];
             $minutes = $date_time_array ['minutes'];
             $seconds = $date_time_array ['seconds'];
             $month = $date_time_array ['mon'];
             $day = $date_time_array ['mday'];
             $year = $date_time_array ['year'];
             $timestamp1 = mktime ( $hours, $minutes, $seconds, $month, $day, $year );
             // echo '===='.$timestamp1.'===ok';exit;
             $timestamp = $timestamp1 - ($SERVER_GMT + $USER_GMT);
    
             if ($fulldate == 1) {
               $date = date ( "Y-m-d H:i:s", $timestamp );
             } else {
               $date = date ( "Y-m-d", $timestamp );
             }
             return $date;
           }
    

【问题讨论】:

    标签: php angular api codeigniter-3


    【解决方案1】:

    PHP是一种服务器端编程语言,它只会显示服务器端时间。

    要获得用户时区,您必须使用客户端语言,即 Jquery/Javascript。

    var timezone_offset_minutes = new Date().getTimezoneOffset();
    
    timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes;
    
    console.log(timezone_offset_minutes); // 300
    

    这只是一个例子。在应用程序中,这将来自 Javascript(通过 AJAX 或其他方式)

    $timezone_offset_minutes = 300;  // $_GET['timezone_offset_minutes']
                
    // Convert minutes to seconds
    $timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
            
    echo $timezone_name; //Asia/Karachi
    

    获得时区后,您可以设置date_default_timezone_set($timezone_name); 也可以在数据库中检查它,但为了更好的实践,请尝试由用户保存时区或允许他们更改工具。最好向他们展示他们当前的时区。

    我希望这会清除您的查询。

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多