如何将服务器时间转换为Laravel当地时间?

时间:2016-03-22 06:46:59

标签: php jquery laravel time timezone

我想在Laravel当地时间打印时间。如果用户创建帖子,它将在服务器上显示创建的时间。如何在当地时间显示它?

在我的刀片文件中,我使用此代码显示创建的时间,

{{{ $posts->updated_at }}}

显示数据库中的时间,即服务器时间。如何将其转换为当地用户?

8 个答案:

答案 0 :(得分:4)

您可以使用javascript执行此操作。使用以下库:

  1. moment.min.js(http://momentjs.com/downloads/moment.js
  2. moment-timezone-with-data.js()
  3. jstz.min.js(https://bitbucket.org/pellepim/jstimezonedetect
  4. 以下是代码:

    var update_at = '<?php echo $posts->updated_at;?>'; //set js variable for updated_at
    var serverTimezone = 'YOUR SERVER TIME ZONE'; //set js variable for server timezone
    var momentJsTimeObj = moment.tz(update_at, serverTimezone); //create moment js time object for server time
    var localTimeZone = jstz.determine(); //this will fetch user's timezone
    var localTime = momentJsTimeObj.clone().tz(localTimeZone.name()).format(); //convert server time to local time of user
    

    现在您可以通过js

    显示当地时间

答案 1 :(得分:2)

尝试这种方法,我认为这就是你想要的:

$localTime = $object->created_at->timezone($this->auth->user()->timezone);

此处,$this->auth->user()->timezone将返回当前用户的时区,timezone()会将created_at转换为用户的本地时间。

如果您希望获得所有访问者时区(不仅仅是登录用户),您可以打包Laravel,类似于laravel-geoip。它将为您生成$visitor['timezone'],您可以像这样使用:

$localTime = $object->created_at->timezone($visitor['timezone']);

答案 2 :(得分:2)

最佳选择是使用Javascript执行此操作,获取客户端的时区,然后相应地将服务器时间转换为cleint。

请参阅https://stackoverflow.com/a/1837243/4007628

答案 3 :(得分:2)

我找到了一种通过使用会话将时间转换为本地时间的解决方案。当前时区偏移将存储在会话上以计算用户时间。创建一个jquery post函数,将用户时区偏移量发布到session。这是我的代码,

<强> default.blade.php

@if($current_time_zone=Session::get('current_time_zone'))@endif
<input type="hidden" id="hd_current_time_zone" value="{{{$current_time_zone}}}">
// For assigning session value to hidden field. 

<script type="text/javascript">
  $(document).ready(function(){
      if($('#hd_current_time_zone').val() ==""){ // Check for hidden field is empty. if is it empty only execute the post function
          var current_date = new Date();
          curent_zone = -current_date.getTimezoneOffset() * 60;
          var token = "{{csrf_token()}}";
          $.ajax({
            method: "POST",
            url: "{{URL::to('ajax/set_current_time_zone/')}}",
            data: {  '_token':token, curent_zone: curent_zone } 
          }).done(function( data ){
        });   
      }       
});

<强> routes.php文件

Route::post('ajax/set_current_time_zone', array('as' => 'ajaxsetcurrenttimezone','uses' => 'HomeController@setCurrentTimeZone'));

<强> HomeController.php

public function setCurrentTimeZone(){ //To set the current timezone offset in session
    $input = Input::all();
    if(!empty($input)){
        $current_time_zone = Input::get('curent_zone');
        Session::put('current_time_zone',  $current_time_zone);
    }
}

<强>助手/ helper.php

function niceShort($attr) {
    if(Session::has('current_time_zone')){
       $current_time_zone = Session::get('current_time_zone');
       $utc = strtotime($attr)-date('Z'); // Convert the time zone to GMT 0. If the server time is what ever no problem.

       $attr = $utc+$current_time_zone; // Convert the time to local time
       $attr = date("Y-m-d H:i:s", $attr);
    }
    return attr;
}

<强> index.blade.php

{{ niceShort($posts->updated_at) }}

现在我们可以在客户时区打印时间。时区设置代码仅在会话清空时运行。

答案 4 :(得分:1)

试试这个:

$dt = new DateTime($posts->updated_at);
$tz = new DateTimeZone('Asia/Kolkata'); // or whatever zone you're after

$dt->setTimezone($tz);
echo $dt->format('Y-m-d H:i:s');

答案 5 :(得分:0)

转到Config文件夹中的app.php页面并更改此

'timezone' => 'UTC',

'timezone' => 'addYourTimeZoneHere',

参考 https://laravel.com/docs/5.5/configuration

找到你的时区 http://php.net/manual/en/timezones.php

答案 6 :(得分:0)

服务器时间应与UTC时区保持一致

在前端,您可以使用moment.js渲染正确的本地时区。我在2.22.2版本中对此进行了测试。

只需在日期时间值中添加Z,时刻就会将日期呈现到用户的本地时区

moment(dateTimeValue + ' Z'); 

答案 7 :(得分:-2)

在app.php页面

中注释时区设置
//'timezone' => 'UTC',