你在哪里处理时区计算,最好是在服务器上或在客户端上使用javascript库来做这件事吗?
目前我在使用此库的服务器上进行此操作: https://github.com/camroncade/timezone
和这两个:
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();
}
}
在服务器上执行此操作或在客户端上执行任何操作是否有任何缺点?
哪种方法更好?
答案 0 :(得分:2)
始终存储服务器时间。它易于处理,因此您可以轻松更改时区(只需更改一个字段,而不是所有现有记录)。
然后在视图中每次输出转换。创建了解当前用户及其时区的简单timeHelper
,并将其注入视图@inject('timehelper', 'App\Services\Timehelper')
和{{ $timehelper->out($model->created_at) }}
。在out()
中只需应用用户的时区。有时可以使用服务器时区输出原始时间,然后使用以下属性通过moment.js
进行转换:<span ts="150...">20:20 20th July</span>
您必须根据用户当地时间严格计费的情况存储客户的时间。
答案 1 :(得分:1)
在客户端上,您必须考虑用户在前往不同时区时随身携带笔记本电脑的情况。现在有服务器时间,用户的本地时间和用户的笔记本电脑时间。在您考虑时间敏感交易中的任何延迟之前就已经过了。
答案 2 :(得分:0)
在服务器端执行此操作。我认为这会更“美丽”