DateUtility.js

angular.module('homepage').
factory('DateUtility', function() {
    var monthShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

    return {
        getTimeStr: getTimeStr,
        getDateStr: getDateStr,
        getDateOnly: getDateOnly,
        getDateEnd: getDateEnd,
        getMonthDateRange: getMonthDateRange,
        getGmtTimestamp: getGmtTimestamp,
        newDateSameRef: newDateSameRef,
        compareDateOnly: compareDateOnly,
        isBetweenDates: isBetweenDates
    }

    /**
     * Get time from date as string
     * @param  {Date} date Date object/Timestamp
     * @return {string}      Time as string 'hh:mm:ss am/pm'
     */
    function getTimeStr(date) {
			date = new Date(date) || new Date();
			var hours = date.getHours();
			var minutes = date.getMinutes();
			var seconds = date.getSeconds();
			var ampm = hours >= 12 ? 'pm' : 'am';
			hours = hours % 12;
			hours = hours ? hours : 12; // the hour '0' should be '12'
			minutes = minutes < 10 ? '0' + minutes : minutes;
			seconds = seconds < 10 ? '0' + seconds : seconds;
			var strTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;
			return strTime;
		}

    /**
     * Get date from date as string
     * @param  {Date} date Date object/Timestamp
     * @return {string}      Date as string 'dd MMM yyyy'
     */
	function getDateStr(date) {
		date = new Date(date) || new Date();
		return date.getDate() + ' ' + monthShort[date.getMonth()] + ' ' + date.getFullYear();
	}

    /**
     * Get date only with time part set to zero
     * @param  {Date} date Date object/Timestamp
     * @return {Date}      Date object
     */
    function getDateOnly(date) {
    	date = new Date(date);
    	return new Date(date.setHours(0,0,0,0));
    }

    /**
     * Get date only with time part set to zero
     * @param  {Date} date Date object/Timestamp
     * @return {Date}      Date object
     */
    function getDateEnd(date) {
        date = new Date(date);
        return new Date(date.setHours(23,59,59,999));
    }

    function getMonthDateRange(date) {
        date = new Date(date);
        var firstDay = new Date(date.getFullYear(), date.getMonth(), 1);
        var lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);
        return {
            start: getDateOnly(firstDay),
            end: getDateEnd(lastDay)
        };
    }

    /**
     * Convert timestamp from local timezone to GMT
     * @param  {Date} date Date/Timestamp
     * @return {Number}      Timestamp in GMT
     */
    function getGmtTimestamp(date) {
        if(!date) {
            date = new Date();
        }
        // Timestamp in client time zone
        var timestamp = new Date(date).getTime();
        var offset = new Date().getTimezoneOffset(); // in minutes
        // Convert local time to GMT
        // TODO add or substract based on the offset value
        timestamp = timestamp + (offset * 60 * 1000);
        return timestamp;
    }

    /**
     * Get latest date keeping the refrence of the passed date object
     * @param  {Date} date Date object/Timestamp
     * @return {Date}      Date object
     */
    function newDateSameRef(date) {
        date = new Date(date);
        date.setTime(new Date().getTime());
        return date;
    }

    /**
     * Compare dates without comparing time
     * @param  {Date} date1 Date object/Timestamp
     * @param  {Date} date2 Date object/Timestamp
     * @return {Number}     Difference in dates after setting time to zero
     */
    function compareDateOnly(date1, date2) {
    	date1 = getDateOnly(date1);
    	date2 = getDateOnly(date2);

    	var oneday = 24*60*60*1000; // hours*minutes*seconds*milliseconds
    	var diff   = (date1.getTime() - date1.getTime())/ oneday;

    	return diff;
    }

    /**
     * Check if the given date falls between from and to date
     * @param  {Date}  date            Date to be compared
     * @param  {Date}  fromDate        From Date
     * @param  {Date}  toDate          To Date
     * @param  {Boolean} isFromInclusive Is from date inclusive
     * @param  {Boolean} isToInclusive   Is to date inclusive
     * @return {Boolean}                 [description]
     */
    function isBetweenDates(date, fromDate, toDate, isFromInclusive, isToInclusive) {
        var isWithinRange = false;

        date        = new Date(date);
        fromDate    = getDateOnly(fromDate);
        toDate      = getDateEnd(toDate);

        if(isFromInclusive && isToInclusive) {
            isWithinRange = date >= fromDate && date <= toDate;
        }
        else if(isFromInclusive) {
            isWithinRange = date >= fromDate && date < toDate;
        }
        else if(isToInclusive) {
            isWithinRange = date > fromDate && date <= toDate;
        }
        else {
            isWithinRange = date > fromDate && date < toDate;
        }

        return isWithinRange;
    }

});