我一直在尝试使用 Date.Now()和 Carbon :: now()等不同方法从服务器获取时间,但是这种方法存在问题访问者可以轻松更改其计算机时间,并且服务器上的返回响应将根据访问者在计算机上的时间而变化。
这就是我实际上想要做的
数据库中有6个不同的问题,我想在不同的日子展示。
例如:我想在2019年11月20日展示第1个问题,在2019年11月24日,我想展示第2个问题
这里的问题是,如果访客将日期更改为11月24日,他将能够提前看到问题,而我只希望他们在系统中指定的日期知道该问题。
这是我将回复发送回我的AJAX呼叫的方式。
public function getSer(Request $request)
{
$now = new DateTime('now',new DateTimezone('America/New_York'));
return response()->json($now);
}
返回的时间基于本地客户端时间而不是服务器。
我也尝试了以下方法:
$question = Questions::where('question_start', '<=', Carbon::now('America/New_York'))->where('question_end', '>=', Carbon::now('America/New_York'))->first();
dd($question);
但是结果随着我更改操作系统日期而改变
答案 0 :(得分:1)
解决方案很简单:
在服务器上执行日期/时间检查并提出问题
类似这样的东西:
<?php
$question_one_start = DateTime::createFromFormat('Y-m-d H:i:s','2019-11-20 00:00:00',new DateTimezone('America/New_York'));
$question_one_end = clone $question_one_start;
$question_one_end->modify('+1 day');
$now = new DateTime('now',new DateTimezone('America/New_York'));
if($now >= $question_one_start && $now < $question_one_end){
echo "Question output here.";
}
else if( ... ) {
....
}
使用此方法,您无需在客户端上执行任何类型的日期/时间检查。
答案 1 :(得分:0)
日期/时间演示是一个客户端/ UI问题。客户端应采用服务器返回的时间(无论是否使用UTC),并将其转换为客户端的本地时区。
由于更新了问题而进行了修改:我仍然看不到该问题。服务器负责提取直到(我假设)当前日期为止的问题。客户的日期/时间不重要。服务器仍将仅获取并返回当前日期的问题。如果客户将日期更改为2100年,则不会影响服务器正在执行的查询。
问题可能出在让客户端指定日期/时间查询范围而不是服务器吗?