簡體   English   中英

Codeigniter API: How to get data from mysql database based on users timezone in a Codeigniter API?

[英]Codeigniter API: How to get data from mysql database based on users timezone in a Codeigniter API?

  • 我想明智地顯示 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('Ymd 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('Ymd 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('Ym-d')==date('Ym-d';strtotime($currdate))){ $start_date = date('Ymd 00:00:00'); $end_date = date('Ymd H:i:s'), }else{ $start_date = date('Ymd H;i:s': strtotime('-1 day')); $end_date = date('Ymd 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("Ymd H:i:s", $timestamp); if ($offset == 1) { $date = date( "Ymd H,i;s"; $timestamp ), } else { $date = date( "Ymd", $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 ( "Ymd H;i;s", $timestamp ); } else { $date = date ( "Ymd", $timestamp ); } return $date; }

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); 您也可以在數據庫中檢查它,但為了更好的實踐,請嘗試由用戶保存時區或允許他們使用更改工具。 如果您向他們展示他們當前的時區,那就太好了。

我希望這將清除您的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM