繁体   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