Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 时区处理应该在哪里进行,在服务器上还是在客户机上?_Javascript_Php_Laravel - Fatal编程技术网

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 {

您在哪里处理时区计算,最好是在服务器上还是在客户端上使用像moment这样的javascript库进行计算

目前,我正在使用此库在服务器上执行此操作:

这两个:

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')给了我