magi4000
magi4000

Reputation: 409

Facebook API PHP - Posts 'created_time' data not displaying properly

I am making a Facebook application using PHP. Through the Facebook API the application displays the recent posts from the logged in user. When it came to working on retrieving the created_time of each post, I found that it either did not display anything or only displayed 1970-01-01T00:00:00+0000. (This can be seen in the picture below.) This held even when I used DateTime.

It should return something like 2016-01-31T16:31:26+0000, as seen by using Facebook's Graph API Explorer.

Not sure how to correct this, I was able to get it to display in the correct format like so:

$ts = strtotime($key['created_time']);
$myTime = gmdate(DATE_ISO8601, $ts);

All of the information is pulled from Facebook, and is within a foreach loop. It goes through each post and knows what to put where, and each created_time value is sated as $key['created_time']

Front End Example A front-end example

Graph API Explorer A Graph API Explorer example

This is my code:

<?php

    // Getting all posts published by user
    try {
        $posts_request = $fb->get('/me/posts?fields=id,created_time,message,link,picture,name&limit=7');
        $posts_response = $posts_request->getGraphEdge();
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
        // When Graph returns an error
        echo 'Graph returned an error: ' . $e->getMessage();
        exit;
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
        // When validation fails or other local issues
        echo 'Facebook SDK returned an error: ' . $e->getMessage();
        exit;
    }


    if ($fb->next($posts_response))  {
        $total_posts = $posts_response->asArray();
        $totalPosts = count($total_posts);

        // Form - Post
            echo "<p><strong>* With this text box below, you can post to your Facebook Profile about your experience using this application if you wish. Once submitted, this post will then also appear in the list of your other posts below.</strong></p>";
            echo "<form action='posttouserstimeline.php' method='post'>";
            echo "<textarea name='description' class='posts'></textarea>";
            echo "<br><br>";
            echo "<input type='submit' class='webbutton' value='Post to Facebook'>";
            echo "</form>";
            echo "<br>";
            echo "<p><strong>* Below are your '5' most resent posts, from your Facebook Profile</strong></p>";

            //$date = new DateTime($key['created_time']);

        foreach($total_posts as $key) {

            $ts = strtotime($key['created_time']);
            $myTime = gmdate(DATE_ISO8601, $ts);

            echo "Time and Date of Post: ".$myTime."<br>";
            echo "<img class='postsprofile' alt='profilepic' src='".$picture['url']."'/> <a href='https://facebook.com/".$profile['id']."' target='_blank'>".$profile['name']."</a><br>";
            echo $key['message'].'<br><br>';
             echo "<a href='".$key['link']."' target='_blank'><img class='postsprofile' alt='".$key['name']."' src='".$key['picture']."'/></a><br><hr><br>";

            //echo "<img class='postsprofile' alt='".$key['name']."' src='".$key['picture']."'/><br>";
            //echo "<a href='".$key['link']."' target='_blank'>".$key['link']."</a><br><hr><br>";
        }
    }

Upvotes: 1

Views: 1096

Answers (1)

kayleighsdaddy
kayleighsdaddy

Reputation: 670

The problem is the facebook time function does not give the time in the standard numeric form needed for the call from strtotime to work. Here is a function I found online that converts facebook time to the time in the standard numeric form we are used to.

var fuzzyFacebookTime = (function(){

  fuzzyTime.defaultOptions={
    // time display options
    relativeTime : 48,
    // language options
    monthNames : ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    amPm : ['AM', 'PM'],
    ordinalSuffix : function(n) {return ['th','st','nd','rd'][n<4 || (n>20 && n % 10<4) ? n % 10 : 0]}
  }

  function fuzzyTime (timeValue, options) {

    var options=options||fuzzyTime.defaultOptions, 
        date=parseDate(timeValue),
        delta=parseInt(((new Date()).getTime()-date.getTime())/1000),
        relative=options.relativeTime,
        cutoff=+relative===relative ? relative*60*60 : Infinity;

    if (relative===false || delta>cutoff)
      return formatTime(date, options)+' '+formatDate(date, options);

    if (delta<60) return 'less than a minute ago';
    var minutes=parseInt(delta/60 +0.5);
    if (minutes <= 1) return 'about a minute ago';
    var hours=parseInt(minutes/60 +0.5);
    if (hours<1) return minutes+' minutes ago';
    if (hours==1) return 'about an hour ago';
    var days=parseInt(hours/24 +0.5);
    if (days<1) return hours+' hours ago';
    if (days==1) return formatTime(date, options)+' yesterday';
    var weeks=parseInt(days/7 +0.5);
    if (weeks<2) return formatTime(date, options)+' '+days+' days ago';
    var months=parseInt(weeks/4.34812141 +0.5);
    if (months<2) return weeks+' weeks ago';
    var years=parseInt(months/12 +0.5);
    if (years<2) return months+' months ago';
    return years+' years ago';
  }

  function parseDate (str) {
    var v=str.replace(/[T\+]/g,' ').split(' ');
    return new Date(Date.parse(v[0] + " " + v[1] + " UTC"));
  }

  function formatTime (date, options) {
    var h=date.getHours(), m=''+date.getMinutes(), am=options.amPm;
    return (h>12 ? h-12 : h)+':'+(m.length==1 ? '0' : '' )+m+' '+(h<12 ? am[0] : am[1]);
  }

  function formatDate (date, options) {
    var mon=options.monthNames[date.getMonth()],
        day=date.getDate(),
        year=date.getFullYear(),
        thisyear=(new Date()).getFullYear(),
        suf=options.ordinalSuffix(day);

    return mon+' '+day+suf+(thisyear!=year ? ', '+year : '');
  }

  return fuzzyTime;

}());

Source: http://tipsandtricks.nogoodatcoding.com/2011/02/facebook-createdtime-format-in-json.html

Upvotes: 1

Related Questions