应该在服务器上还是在客户端上进行时区处理?

时间:2017-08-09 19:22:35

标签: javascript php laravel

你在哪里处理时区计算,最好是在服务器上或在客户端上使用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();
    }
}

在服务器上执行此操作或在客户端上执行任何操作是否有任何缺点?

哪种方法更好?

3 个答案:

答案 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)

在服务器端执行此操作。我认为这会更“美丽”