Skip to content

Instantly share code, notes, and snippets.

@erkobridee
Last active November 10, 2016 15:15
Show Gist options
  • Save erkobridee/51c6d2b2dd070cb51afe to your computer and use it in GitHub Desktop.
Save erkobridee/51c6d2b2dd070cb51afe to your computer and use it in GitHub Desktop.
parse raw date and get correct moment.js object
// http://momentjs.com/
/**
* Creates and returns a moment object form the 'rawDate' or null in case of an invalid date
* @param rawDate
* @return {moment}
*/
function parseDate(rawDate){
if(!rawDate){
return moment.invalid();
}
var DATE_PATTERN = {
GMT : /gmt/i,
// example: FEB 07, 2016 or FEB 07, 2016 10:00 AM
US_DATE : /^(\w{3}\s\d{1,2},\s\d{4})(\s(\d{1,2}:{0,1}){2}\s(am|pm)){0,1}?$/i,
// example: 2016-02-07 or 2016-02-07 10:00:00
CUSTOM_DATE : /^(\d{4}-\d{1,2}-\d{1,2})(\s(\d{1,2}:{0,1}){2,3}){0,1}?$/i,
// example: Sun Feb 07 2016 or Sun Feb 07 2016 07:00:00
JS_DATETIME : /^(\w{3}\s\w{3}\s\d{1,2}\s\d{4})(\s(\d{1,2}:{0,1}){3}(\s\w{3}-\d{4}){0,1}){0,1}?$/i
};
var momentDate = null;
if(moment.isMoment(rawDate)) {
momentDate = rawDate;
} else if(
moment.isDate(rawDate) &&
(rawDate.getDate() >= 0)
) {
momentDate = moment(rawDate);
} else if(
(typeof rawDate === 'string') &&
DATE_PATTERN.GMT.test(rawDate)
) {
momentDate = moment(new Date(rawDate));
} else if(
(typeof rawDate === 'string') &&
(
DATE_PATTERN.US_DATE.test(rawDate) ||
DATE_PATTERN.CUSTOM_DATE.test(rawDate) ||
DATE_PATTERN.JS_DATETIME.test(rawDate)
)
) {
// fix to get the correct date/time in whatever timezone
momentDate = moment(rawDate,[
'MMM DD, YYYY hh:mm a', // US datetime pattern
'MMM DD, YYYY HH:mm',
'MMM DD, YYYY',
'YYYY-MM-DD HH:mm:ss', // custom datetime pattern
'YYYY-MM-DD HH:mm',
'YYYY-MM-DD',
'ddd MMM DD YYYY HH:mm:ss', // javascript date object datetime pattern
'ddd MMM DD YYYY HH:mm',
'ddd MMM DD YYYY'
]);
} else {
momentDate = moment.invalid();
}
return momentDate;
}
  • pattern that causes timezone wrong value

    • FEB 07, 2016

    • FEB 07, 2016 10:00 AM

var US_DATETIME_PATTERN_REGEXP = /^(\w{3}\s\d{1,2},\s\d{4})(\s(\d{1,2}:{0,1}){2}\s(am|pm)){0,1}?$/i;
var US_DATETIME_PATTERN_MOMENT = 'MMM DD, YYYY hh:mm a';
  • pattern that works with timezones

    • 2016-02-07

    • 2016-02-07 10:00:00

var CUSTOM_DATETIME_PATTERN_REGEXP = /^(\d{4}-\d{1,2}-\d{1,2})(\s(\d{1,2}:{0,1}){2,3}){0,1}?$/i;
var CUSTOM_DATETIME_PATTERN_MOMENT = 'YYYY-MM-DD HH:mm:ss';
  • javascript date object string pattern

    • Sun Feb 07 2016

    • Sun Feb 07 2016 07:00:00

var JS_DATETIME_PATTERN_REGEXP = /^(\w{3}\s\w{3}\s\d{1,2}\s\d{4})(\s(\d{1,2}:{0,1}){3}(\s\w{3}-\d{4}){0,1}){0,1}?$/i;
var JS_DATETIME_PATTERN_MOMENT = 'ddd MMM DD YYYY HH:mm:ss';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment