6

I would like to print the time in local time in Laravel. If the user create a post it will display the created time on the server. How can I display it in local time ?

In my blade file I used this code to display created time,

{{{ $posts->updated_at }}}

Which displays the time in database, which is a server time. How can I convert it to users local time ?

Vinod VT
  • 6,946
  • 11
  • 51
  • 75
  • Your basic options are 1) Do this client-side, where you have better information about the time zone; make your response contain the UTC timestamp in some JSON, and then write Javascript to display that timestamp in local time; 2) Tell the server which time zone the user is in (which can be somewhat tricky in itself) and perform the conversion at the server side. – Jon Skeet Mar 22 '16 at 06:55

8 Answers8

6

I found a solution to convert time to local time by using session. The current time zone offset will store on session to calculate users time. Create a jquery post function to post users timezone offset to session. This is my code,

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);
    }
}

Helpers/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) }}

Now we can print the time in clients time zone. The time zone setting code run only when the session empty.

Vinod VT
  • 6,946
  • 11
  • 51
  • 75
4

You can do this by using javascript. Use following libraries:

  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)

Here is the code :

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

Now you can display local time through js

Jeff Puckett
  • 37,464
  • 17
  • 118
  • 167
BugCoder
  • 306
  • 2
  • 8
2

Try this method, I think this is what you want:

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

Here, $this->auth->user()->timezone will return current user's timezone, and timezone() will convert created_at to to user's local time.

If you want to get all visitors timezone (not just logged in users), you can you package for Laravel similar to laravel-geoip. It will generate $visitor['timezone'] for you which you can use like this:

$localTime = $object->created_at->timezone($visitor['timezone']);
Alexey Mezenin
  • 158,981
  • 26
  • 290
  • 279
  • No change, It will display the same time – Vinod VT Mar 22 '16 at 07:10
  • How exactly are trying to use it? Can you show full code? – Alexey Mezenin Mar 22 '16 at 07:17
  • 1
    invalid answer i am afraid. this would only work if there is such a column in the users table called timezone or a method returning the desired data. Laravel out of box does not record a registered user's geo-location and in turn timezone. – seedme Mar 08 '21 at 02:13
2

Best option is to do this with Javascript, get client's timezone and then convert server time to cleint's accordingly.

Please refer https://stackoverflow.com/a/1837243/4007628

Community
  • 1
  • 1
akash
  • 101
  • 1
  • 9
1

Try this:

$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');
vipul sorathiya
  • 1,318
  • 12
  • 23
1

Go to app.php page in Config folder and change this

'timezone' => 'UTC',

to

'timezone' => 'addYourTimeZoneHere',

reference https://laravel.com/docs/5.5/configuration

find your timezone http://php.net/manual/en/timezones.php

0

Server time should stick with UTC timezone

In front end, you can use moment.js to render the correct local timezone. I tested this in moment version 2.22.2.

Simply add Z to the datetime value and moment will render the date to user's local time zone

moment(dateTimeValue + ' Z'); 
ace.spades
  • 33
  • 5
-3

Comment the timezone settings in app.php page

//'timezone' => 'UTC',
Neethu
  • 124
  • 2
  • 2
  • 11