Php 从具有不同时区的表中获取当前日期记录
这个问题与我的预览一有关: 在我标出答案后,发现一个问题: 当用户加载页面时,它需要给他当天的记录 例如从00:00:00到现在 问题是,在我的模型(在上面的链接中)解析到本地时间之后,控制器要求DB提供UTC 00:00:00的记录 当地时间为欧洲/索非亚(+3小时),导致从今天03:00:00开始错过3条记录 知道怎么修吗 控制员:Php 从具有不同时区的表中获取当前日期记录,php,laravel,postgresql,Php,Laravel,Postgresql,这个问题与我的预览一有关: 在我标出答案后,发现一个问题: 当用户加载页面时,它需要给他当天的记录 例如从00:00:00到现在 问题是,在我的模型(在上面的链接中)解析到本地时间之后,控制器要求DB提供UTC 00:00:00的记录 当地时间为欧洲/索非亚(+3小时),导致从今天03:00:00开始错过3条记录 知道怎么修吗 控制员: function getdata_chart(Request $request) { $start_date = dat
function getdata_chart(Request $request)
{
$start_date = date('d-m-Y 00:00:00');
$end_date = date('d-m-Y 23:59:59');
if($request->start_date != '' && $request->end_date != '')
{
// if user fill dates
$dateScope = array($request->start_date ." 00:00:00", $request->end_date ." 23:59:59");
} else {
// default load page - today
$dateScope = array($start_date, $end_date);
};
$students = MeasCanal::whereBetween('recordtime', $dateScope)
->selectRaw('recordtime')
->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Кота\') as iazovir')
->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Температура\') as temperatura350')
->where(function ($query) {
$query->where('fullname', 'like', "Язовир.Данни.Кота")
->orWhere('fullname', 'like', "ГСК_11_350.Данни.Температура");
})
->groupBy('recordtime')
->orderBy('recordtime')
->get();
return response()->json($students);
}
return response()->json($students);
}
模型:
class MeasCanal extends Model
{
protected $connection = 'MeasCanal';
protected $table = 'meas_kanal';
protected $fillable = ['fullname','formattedvalue','recordtime','qualitydesc','statedesc','id'];
/**
* Get the user's recordtime.
*
* @param string $value
* @return string
*/
public function getRecordtimeAttribute($value)
{
return Carbon::parse($value)->timezone('Europe/Sofia')->toDateTimeString();
}
}
您必须通过调用carbon方法和array map函数将用户输入日期从DB时区映射到用户时区。并按原样调用查询
function getdata_chart(Request $request) {
$start_date = date('d-m-Y 00:00:00');
$end_date = date('d-m-Y 23:59:59');
if($request->start_date != '' && $request->end_date != '')
{
// if user fill dates
$dateScope = array($request->start_date ." 00:00:00", $request->end_date ." 23:59:59");
} else {
// default load page - today
$dateScope = array($start_date, $end_date);
};
$dbTimeZone = 'Asia/Kolkata'; // update with your db timezone
$userTimeZone = 'Europe/Sofia';
$dateScope = array_map(function($date) use ($dbTimeZone, $userTimeZone) {
return Carbon::createFromFormat('d-m-Y H:i:s', $date, $dbTimeZone)->setTimezone($userTimeZone);
}, $dateScope);
$students = MeasCanal::whereBetween('recordtime', $dateScope)
->selectRaw('recordtime')
->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Кота\') as iazovir')
->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Температура\') as temperatura350')
->where(function ($query) {
$query->where('fullname', 'like', "Язовир.Данни.Кота")
->orWhere('fullname', 'like', "ГСК_11_350.Данни.Температура");
})
->groupBy('recordtime')
->orderBy('recordtime')
->get();
return response()->json($students);
}
return response()->json($students);
}
注意:-如果您尚未使用carbon til,请在控制器中添加以下行
使用碳\碳
问题是每个函数上的日期分隔符不同,导致
发现意外数据。
。在编辑了他的答案后,萨钦·库马尔完成了工作。谢谢你。
只需使用类似的长途跋涉解决方案来发现问题:
$start_date0 = date('d-m-Y 00:00:00');
$end_date0 = date('d-m-Y 23:59:59');
$start_date = Carbon::createFromFormat('d-m-Y H:i:s', $start_date0, 'Europe/Sofia')->setTimezone('UTC');
$end_date = Carbon::createFromFormat('d-m-Y H:i:s', $end_date0, 'Europe/Sofia')->setTimezone('UTC');
if($request->start_date != '' && $request->end_date != '')
{
// if user fill dates
$start_date0 = $request->start_date;
$end_date0 = $request->end_date;
$start_date = Carbon::createFromFormat('d/m/Y H:i:s', $start_date0, 'Europe/Sofia')->setTimezone('UTC');
$end_date = Carbon::createFromFormat('d/m/Y H:i:s', $end_date0, 'Europe/Sofia')->setTimezone('UTC');
$dateScope = array($start_date, $end_date);
} else {
// default load page - today
$dateScope = array($start_date, $end_date);
};
你能展示一些代码吗?与上一个问题一样,您只需通过定义一个访问器来更改属性的值。让我检查一下。我已经添加了答案。您可以检查并实现它。该代码仅在用户没有交互时工作。但是$dbTimeZone绑定什么代码,因为DB是UTC格式的。如果用户选择了一个日期,则会显示衰减错误:“发现意外数据”。↵发现意外数据。↵数据丢失“”。从此处搜索您的时区,或者在用户与formI交互时显示“$request->start_date”和“$request->end_date”值的输出,我知道时区是UTC。但是当绑定到$dbTimeZone='UTC'时;我的问题是发布请求时开始日期和结束日期变量的值和类型是什么。它应该是一个类似于start_date=“10-04-2020”和end_date=“10-04-2020”的字符串