Javascript 时区处理应该在哪里进行,在服务器上还是在客户机上?
您在哪里处理时区计算,最好是在服务器上还是在客户端上使用像moment这样的javascript库进行计算 目前,我正在使用此库在服务器上执行此操作: 这两个:Javascript 时区处理应该在哪里进行,在服务器上还是在客户机上?,javascript,php,laravel,Javascript,Php,Laravel,您在哪里处理时区计算,最好是在服务器上还是在客户端上使用像moment这样的javascript库进行计算 目前,我正在使用此库在服务器上执行此操作: 这两个: public function getPublishedAtAttribute() { if(Auth::guest()) { return $this->attributes['published_at']->format('Y-m-d\TH:i\Z'); } else {
public function getPublishedAtAttribute()
{
if(Auth::guest()) {
return $this->attributes['published_at']->format('Y-m-d\TH:i\Z');
}
else {
$timezone = Auth::user()->timezone;
if(isset($this->attributes['published_at']))
return Timezone::convertFromUTC($this->attributes['published_at'], $timezone, 'Y-m-d H:i');
else
return null;
}
}
public function setPublishedAtAttribute($published_at)
{
if($published_at) {
$published_at_temp = new Carbon($published_at, Auth::user()->timezone);
$this->attributes['published_at'] = Timezone::convertToUTC($published_at_temp->addSeconds(59), Auth::user()->timezone);
}
elseif(!$this->published_at) {
$this->attributes['published_at'] = Carbon::now();
}
}
在服务器上这样做有什么缺点,在客户端这样做有什么优点
哪种方法更好?在服务器端执行。我认为在服务器端这样做会更“漂亮”。我认为在客户机上会更“漂亮”,你必须考虑到当用户前往不同时区时,他们会随身携带笔记本电脑。现在是服务器时间、用户的本地时间和用户的笔记本电脑时间。这是在考虑时间敏感事务中的任何延迟之前。在客户端,您必须考虑用户在前往不同时区时携带笔记本电脑的情况。现在是服务器时间、用户的本地时间和用户的笔记本电脑时间。这是在考虑时间敏感事务中的任何延迟之前。始终存储服务器时间。这很容易处理,因此您可以提供一个轻松的机会来更改时区(只需更改一个字段,而不是所有现有记录) 然后在视图中每次转换输出。创建简单的
timeHelper
,它知道当前用户及其时区,并将其插入视图@inject('timeHelper','App\Services\timeHelper')
和{{{$timeHelper->out($model->created_at)}
。在out()
中只需应用用户的时区。有时很容易使用服务器时区输出原始时间,然后通过moment.js
转换,使用一些属性:20:20 July 20th
您必须根据用户的本地时间存储客户端的时间,以防您有严格的账单。始终存储服务器时间。这很容易处理,因此您可以提供一个轻松的机会来更改时区(只需更改一个字段,而不是所有现有记录) 然后在视图中每次转换输出。创建简单的
timeHelper
,它知道当前用户及其时区,并将其插入视图@inject('timeHelper','App\Services\timeHelper')
和{{{$timeHelper->out($model->created_at)}
。在out()
中只需应用用户的时区。有时很容易使用服务器时区输出原始时间,然后通过moment.js
转换,使用一些属性:20:20 July 20th
您必须存储客户的时间,以防您根据用户的本地时间进行严格的计费。您所说的美丽是什么意思?请考虑为这一决定增加一些有力的论据。“Kuba……好的,你有什么论据?只需点击答案上的负号!有人可能会争论很多事情,例如,如果用户更改了位置,您是否会更新服务器中的日期?数据一致性如何?数据中存储了不同的时区,因此很难对其进行操作。数据库中的日期最好与服务器的时间相匹配。你说的漂亮是什么意思?请考虑为这一决定增加一些有力的论据。“Kuba……好的,你有什么论据?只需点击答案上的负号!有人可能会争论很多事情,例如,如果用户更改了位置,您是否会更新服务器中的日期?数据一致性如何?数据中存储了不同的时区,因此很难对其进行操作。数据库中的日期最好与服务器的时间保持一致。始终在客户端。这样,您不仅可以考虑用户更改位置(如答案中所述),还可以将所有数据以一种格式保存在数据库中,并防止服务器进行额外(不必要)处理。始终在客户端。这样,您不仅可以考虑用户更改位置(如答案中所述),还可以将所有数据以一种格式保存在数据库中,并防止服务器进行额外(不必要)处理。如果我在客户端执行此操作,是否所有现代浏览器都支持检测用户时区,以便像moment这样的库能够检测到这一点,然后将正确的时区和日期发送到服务器?据我所知,时区是由操作系统报告的。假设你住在纽约,这是美国东部标准-05:00。如果你把你的电脑向西带到伊利诺伊州,你的物理时区将是美国中央标准-06:00,但如果你不更新你的操作系统时钟/时区,它不能只是“知道”。好的,如果我在客户端上做,是否所有现代浏览器都支持检测用户时区,以便像moment这样的库能够检测到这一点,然后将正确的时区和日期发送到服务器?据我所知,时区是由操作系统报告的。假设你住在纽约,这是美国东部标准-05:00。如果你把你的电脑向西带到伊利诺伊州,你的物理时区将是美国中央标准时间06:00,但如果你不更新你的操作系统时钟/时区,它不能只是“知道”。嗨,如果我用服务器时区输出原始时间,然后通过矩。js转换它,这是否意味着我可以用矩检测用户时区,然后转换到该时区?例如,如果网站的访问者未登录,我可以通过moment检测时区并将页面上的所有时间转换为正确的时区?对,moment知道用户的时区,例如查看
moment().utcOffset()
。因此,您只需要一个简单的脚本就可以在任何页面上更改时间。使用以下命令如何:矩.tz.guess()来获得正确的时区,它应该适用于大多数浏览器,您也可以使用它。utcOffset返回时区的数字,GUSE返回其名称。仅报告,此操作不正确:矩.tz(this.initPublishAtDate,moment.tz.guess())。格式('YYYY-MM-DD HH:MM:ss'),输入时间为UFC格式,并将我从DB获得的数据转换回本次工作的:矩.utc(this.initPublishAtDate,'YYYY-MM-DD HH:MM')。本地()格式('YYYY-MM-DD HH:MM')给了我