/** @module date */
import str from './jsturbo-string'
/**
* Converts a date to string in the format 'dd/MM/yyyy'
* @param {Date} Date object
* @return {string}
*/
function toStringDMY (date) {
return [
str.pad(date.getDate().toString(), 2),
str.pad((date.getMonth() + 1).toString(), 2),
str.pad(date.getFullYear().toString(), 4)
].join('/')
}
/**
* Check if a date object represents the current day
* @param {Date}
* @return {Boolean}
*/
function isToday (date) {
return toStringDMY(date) === toStringDMY(new Date())
}
/**
* Create a Date object based on a string in the format 'dd/MM/yyyy'
* @param {string} string with a date in the format 'dd/MM/yyyy'
* @return {Date}
*/
function fromStringDMY (stringDdMmYyyy) {
stringDdMmYyyy = stringDdMmYyyy.replace(/\D/g, '')
var day = parseInt(stringDdMmYyyy.substr(0, 2))
var month = parseInt(stringDdMmYyyy.substr(2, 2)) - 1
var year = parseInt(stringDdMmYyyy.substr(4, 4))
if (year < 0 || year > 9999 ||
month < 0 || month > 11 ||
day < 1 || day > 31) {
throw new Error('Invalid date')
}
return new Date(year, month, day, 0, 0, 0, 0)
}
/**
* Lenient date parser.
* @param {string} string - Date in a reasonable format.
* @return {Date}
* @throws {Error} If the date couldn't be parsed.
*/
function fromString (string) {
var year, month, day
try {
var tokens = string.split(/\D/)
// DD-MM
if (tokens.length === 2) {
day = tokens[0]
month = tokens[1]
year = new Date().getFullYear()
} else if (tokens.length === 3) {
if (tokens[0].length === 4) {
// YYYY-XX-XX
year = tokens[0]
month = tokens[1]
day = tokens[2]
} else {
// DD-MM-YYYY
day = tokens[0]
month = tokens[1]
year = tokens[2]
}
} else {
throw new Error('invalid length')
}
if (parseInt(month) > 12) {
var temp = month
month = day
day = temp
}
return fromStringDMY(day + '/' + month + '/' + year)
} catch (any) {
throw new Error('Could not format date [' + string + '] (' + any.message + ')')
}
}
/**
* Check if a string can be converted to a valid date.
* @param {string} string - String to check.
* @return {Boolean}
*/
function isDate (string) {
// 1: contains any char other than digits, '/', '-' or space?
var invalidChar = string.search(/[^\d/-\s]/g)
if (invalidChar >= 0) {
return false
}
try {
// 2: try to convert
fromString(string)
return true
} catch (any) {
return false
}
}
const mainExport = {
toStringDMY: toStringDMY,
isToday: isToday,
fromStringDMY: fromStringDMY,
fromString: fromString,
isDate: isDate
}
export default mainExport
module.exports = mainExport // for CommonJS compatibility