dateutils

DateTime

declaration
DateTime

const DateTime = require('./DateTime')
const DateParse = {}
DateParse.parseRegexes = []
DateParse.defaultFormat = 'n/j/Y'

DateParse.parse = function (input, locale) {
  if (typeof input === 'string') {
    if (input === 'today') {
      return DateTime.today()
    }
    const format = locale ? locale.shortDateFormat : DateParse.defaultFormat
    const date = DateParse.parseDate(input, format)
    return date ? date : new DateTime(new Date(input))
  }
  throw new Error("DateParse only accepts strings")
}

DateParse.parseDate = function (input, format) {
  const values = input.match(getOrCreateParseRegexp())
  return values ? matchesToDateTime(values) : null

  function matchesToDateTime(values) {
    const day = matchesToObject(values)
    return DateTime.fromDate(day.Y, (day.m ? day.m : day.n), (day.d ? day.d : day.j))
  }

  function matchesToObject(matchValues) {
    const day = {}
    const keys = format.replace(/[^djmnY]/g, '').split('')
    for (let i = 0; i < keys.length; i++) day[keys[i]] = +matchValues[i + 1]
    return day
  }

  function getOrCreateParseRegexp() {
    if (DateParse.parseRegexes[format] === undefined) {
      DateParse.parseRegexes[format] = new RegExp(format.replace(/[djmnY]/g, '(\\d+)').replace(/\./g, '\\.'))
    }
    return DateParse.parseRegexes[format]
  }
}

DateParse.parseTime = function (timeStr) {
  const splittedTime = splitTime(timeStr.replace(/:|,/i, '.'))
  const time = [+(splittedTime[0]), +(splittedTime[1])]
  return (isHour(time[0]) && isMinute(time[1])) ? time : null

  function splitTime(timeStr) {
    if (timeStr.indexOf('.') !== -1) {
      return timeStr.split('.')
    }
    const splitTimes = {
      4: [timeStr.slice(0, 2), timeStr.slice(2, 4)],
      3: [timeStr.slice(0, 1), timeStr.slice(1, 3)],
      2: [timeStr, 0]
    }
    return splitTimes[timeStr.length] || [-1, -1]
  }

  function isMinute(minutes) { return !isNaN(minutes) && minutes >= 0 && minutes <= 59 }

  function isHour(hours) { return !isNaN(hours) && hours >= 0 && hours <= 23 }
}

module.exports = DateParse