Javascript pubDate RSS Format

3.7k views Asked by At

I have a RSS feed reader created using javascript and need to format the date. At present the pubDate is set to .toLocaleDateString and displays differently on various machines.

Does anybody know if I can set this to a standard dd/mm/yyyy format?

Full javascript below:

    (function ($) {
        var current = null;
        $.fn.rssfeed = function (url, options) {
            var defaults = {
                limit: 10,
                header: true,
                titletag: 'h4',
                date: true,
                content: true,
                snippet: true,
                showerror: true,
                errormsg: '',
                key: null
            };
            var options = $.extend(defaults, options);
            return this.each(function (i, e) {
                var $e = $(e);
                if (!$e.hasClass('rssFeed')) $e.addClass('rssFeed');
                if (url == null) return false;
                var api = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;
                if (options.limit != null) api += "&num=" + options.limit;
                if (options.key != null) api += "&key=" + options.key;
                $.getJSON(api, function (data) {
                    if (data.responseStatus == 200) {
                        _callback(e, data.responseData.feed, options);
                    } else {
                        if (options.showerror) if (options.errormsg != '') {
                            var msg = options.errormsg;
                        } else {
                            var msg = data.responseDetails;
                        };
                        $(e).html('<div class="rssError"><p>' + msg + '</p></div>');
                    };
                });
            });
        };
        var _callback = function (e, feeds, options) {
            if (!feeds) {
                return false;
            }
            var html = '';
            var row = 'odd';
            if (options.header) html += '';
            html += '<div class="rssBody">' + '<ul>';
            for (var i = 0; i < feeds.entries.length; i++) {
                var entry = feeds.entries[i];
                var entryDate = new Date(entry.publishedDate);
                var pubDate = entryDate.toLocaleDateString() + ' ' + entryDate.toLocaleTimeString();
                html += '<li class="rssRow ' + row + '">' + '<' + options.titletag + '><a href="' + entry.link + '" title="View this feed at ' + feeds.title + '"  class="blog">' + entry.title + '</a></' + options.titletag + '>'
                if (options.date) html += '<p class="date">' + pubDate + '</p>'
                if (options.content) {
                    if (options.snippet && entry.contentSnippet != '') {
                        var content = entry.contentSnippet;
                    } else {
                        var content = entry.content;
                    }
                    html += '<p>' + content + '</p><p><a href="' + entry.link + '" class="blogbtn">continue reading</a></p>'
                }
                html += '</li>';
                if (row == 'odd') {
                    row = 'even';
                } else {
                    row = 'odd';
                }
            }
            html += '</ul>' + '</div>'
            $(e).html(html);
        };
    })(jQuery);
3

There are 3 answers

1
bluefoot On

You can do

var pubDate = entryDate.format("dd/mm/yyyy");
0
Radagast the Brown On

Specific implementation for your format: Here:

Date.prototype.ddmmyy = function(){
    function p(n) {return (n>9)?n:"0"+n}
    var m = this.getMonth()
      , d = this.getDate()
      , y = this.getFullYear();
    return [p(d),p(m+1),y%100].join("/")
}

Incorporating your specific request to the code you gave:

(function($){var current=null;$.fn.rssfeed=function(url,options){var defaults={limit:10,header:true,titletag:'h4',date:true,content:true,snippet:true,showerror:true,errormsg:'',key:null};var options=$.extend(defaults,options);return this.each(function(i,e){var $e=$(e);if(!$e.hasClass('rssFeed'))$e.addClass('rssFeed');if(url==null)return false;var api="http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q="+url;if(options.limit!=null)api+="&num="+options.limit;if(options.key!=null)api+="&key="+options.key;$.getJSON(api,function(data){if(data.responseStatus==200){_callback(e,data.responseData.feed,options);}else{if(options.showerror)
if(options.errormsg!=''){var msg=options.errormsg;}else{var msg=data.responseDetails;};$(e).html('<div class="rssError"><p>'+msg+'</p></div>');};});});};var _callback=function(e,feeds,options){if(!feeds){return false;}
var html='';var row='odd';if(options.header)
html+='';html+='<div class="rssBody">'+'<ul>';for(var i=0;i<feeds.entries.length;i++){var entry=feeds.entries[i];var entryDate=new Date(entry.publishedDate);var pubDate=entryDate.ddmmyy()+' '+entryDate.ddmmyy();html+='<li class="rssRow '+row+'">'+'<'+options.titletag+'><a href="'+entry.link+'" title="View this feed at '+feeds.title+'"  class="blog">'+entry.title+'</a></'+options.titletag+'>'
if(options.date)html+='<p class="date">'+pubDate+'</p>'
if(options.content){if(options.snippet&&entry.contentSnippet!=''){var content=entry.contentSnippet;}else{var content=entry.content;}
html+='<p>'+content+'</p><p><a href="'+entry.link+'" class="blogbtn">continue reading</a></p>'}
html+='</li>';if(row=='odd'){row='even';}else{row='odd';}}
html+='</ul>'+'</div>'
$(e).html(html);};})(jQuery);

However, A more generic implementation - to support a format provided as parameter:

function(f) {
    if (!this.isValid()) return 'invalid date';
    f = f || '%x %X';
    f = formats[f.toLowerCase()] || f; // replace short-hand with actual format 
    var d = this;
    return f.replace(/%([a-z%])/gi, function($0, $1) {
        switch ($1) {
        case 'a':
            return Date.getMsg('days')[d.get('day')].substr(0, 3);
        case 'A':
            return Date.getMsg('days')[d.get('day')];
        case 'b':
            return Date.getMsg('months')[d.get('month')].substr(0, 3);
        case 'B':
            return Date.getMsg('months')[d.get('month')];
        case 'c':
            return d.toString();
        case 'd':
            return pad(d.get('date'), 2);
        case 'D':
            return d.get('date');
        case 'e':
            return d.get('date');
        case 'H':
            return pad(d.get('hr'), 2);
        case 'I':
            return ((d.get('hr') % 12) || 12);
        case 'j':
            return pad(d.get('dayofyear'), 3);
        case 'm':
            return pad((d.get('mo') + 1), 2);
        case 'M':
            return pad(d.get('min'), 2);
        case 'o':
            return d.get('ordinal');
        case 'p':
            return Date.getMsg(d.get('ampm'));
        case 's':
            return Math.round(d / 1000);
        case 'S':
            return pad(d.get('seconds'), 2);
        case 'U':
            return pad(d.get('week'), 2);
        case 'w':
            return d.get('day');
        case 'x':
            return d.format(Date.getMsg('shortDate'));
        case 'X':
            return d.format(Date.getMsg('shortTime'));
        case 'y':
            return d.get('year').toString().substr(2);
        case 'Y':
            return d.get('year');
        case 'T':
            return d.get('GMTOffset');
        case 'Z':
            return d.get('Timezone');
        case 'z':
            return pad(d.get('ms'), 3);
        }
        return $1;
    });
}
0
balintpekker On

You can manipulate the properties of each entry by implementing the preprocess callback. Say you want to modify the entries' publishedDate format:

$('#container').feeds({
    feeds: {
        // Your feeds ...
    },
    preprocess: function ( feed ) {
        // Change the publishedDate format from UTC to dd-mm-yyyy

        // Inside the callback 'this' corresponds to the entry being processed
        var date = new Date(this.publishedDate);

        var months = date.getMonth() + 1;
        if ( months <= 9) months = '0' + months;  //adding leading zeros

        var days = date.getDate();
        if (days <= 9) days = '0' + days;         //adding leading zeros

        var pieces = [days, months, date.getFullYear()]
        this.publishedDate = pieces.join('/');
    }
});

You can also use js libraries like moment.js

Hope that helps.