isDate.mjs

import isestr from './isestr.mjs'
import isnum from './isnum.mjs'
import cdbl from './cdbl.mjs'


/**
 * 判斷是否為時間(Date)
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/isDate.test.mjs Github}
 * @memberOf wsemi
 * @param {*} v 輸入任意資料
 * @returns {Boolean} 回傳判斷布林值
 * @example
 *
 * let c
 *
 * c = '2019-01-01T12:34:56:7891+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:7891+08:00 false Invalid Date
 *
 * c = '2019-01-01T12:34:56.7891+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.7891+08:00 true 2019-01-01T04:34:56.789Z
 *
 * c = '2019-01-01T12:34:56:789+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:789+08:00 false Invalid Date
 *
 * c = '2019-01-01T12:34:56.789+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.789+08:00 true 2019-01-01T04:34:56.789Z
 *
 * c = '2019-01-01T12:34:56:78+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:78+08:00 false Invalid Date
 *
 * c = '2019-01-01T12:34:56.78+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.78+08:00 true 2019-01-01T04:34:56.780Z
 *
 * c = '2019-01-01T12:34:56+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56+08:00 true 2019-01-01T04:34:56.000Z
 *
 * c = '2019-01-01T12:34+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34+08:00 true 2019-01-01T04:34:00.000Z
 *
 * c = '2019-01-01T12+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12+08:00 false Invalid Date
 *
 * c = '2019-01-01+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01+08:00 false Invalid Date
 *
 * c = '2019-01+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01+08:00 false Invalid Date
 *
 * c = '2019+08:00'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019+08:00 false Invalid Date
 *
 * c = '2019-01-01T12:34:56:7891Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:7891Z false Invalid Date
 *
 * c = '2019-01-01T12:34:56.7891Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.7891Z true 2019-01-01T12:34:56.789Z
 *
 * c = '2019-01-01T12:34:56:789Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.789Z true 2019-01-01T12:34:56.789Z
 *
 * c = '2019-01-01T12:34:56.789Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:789Z false Invalid Date
 *
 * c = '2019-01-01T12:34:56:78Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:78Z false Invalid Date
 *
 * c = '2019-01-01T12:34:56.78Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.78Z true 2019-01-01T12:34:56.780Z
 *
 * c = '2019-01-01T12:34:56Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56Z true 2019-01-01T12:34:56.000Z
 *
 * c = '2019-01-01T12:34Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34Z true 2019-01-01T12:34:00.000Z
 *
 * c = '2019-01-01T12Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12Z false Invalid Date
 *
 * c = '2019-01-01Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01Z true 2019-01-01T00:00:00.000Z
 *
 * c = '2019-01Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01Z true 2019-01-01T00:00:00.000Z
 *
 * c = '2019Z'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019Z true 2019-01-01T00:00:00.000Z
 *
 * c = '2019-01-01T12:34:56:7891'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:7891 false Invalid Date
 *
 * c = '2019-01-01T12:34:56.7891'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.7891 true 2019-01-01T04:34:56.789Z
 *
 * c = '2019-01-01T12:34:56:789'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:789 false Invalid Date
 *
 * c = '2019-01-01T12:34:56.789'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.789 true 2019-01-01T04:34:56.789Z
 *
 * c = '2019-01-01T12:34:56:78'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:78 false Invalid Date
 *
 * c = '2019-01-01T12:34:56.78'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56.78 true 2019-01-01T04:34:56.780Z
 *
 * c = '2019-01-01T12:34:56'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56 true 2019-01-01T04:34:56.000Z
 *
 * c = '2019-01-01T12:34'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34 true 2019-01-01T04:34:00.000Z
 *
 * c = '2019-01-01T12'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12 false Invalid Date
 *
 * c = '2019-01-01'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01 true 2019-01-01T00:00:00.000Z
 *
 * c = '2019-01'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01 true 2019-01-01T00:00:00.000Z
 *
 * c = '2019'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019 true 2019-01-01T00:00:00.000Z
 *
 * c = '2019-01-01T12:34:56A'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56A false Invalid Date
 *
 * c = '1256'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:789+08:00 false Invalid Date
 *
 * c = '1.25'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:789+08:00 false Invalid Date
 *
 * c = '-1.25'
 * console.log(c, isDate(c), new Date(c))
 * // => 2019-01-01T12:34:56:789+08:00 false Invalid Date
 *
 */
function isDate(v) {
    let t = v
    if (isestr(v)) {
        t = new Date(v)
    }
    if (isnum(v)) {
        t = cdbl(v)
        t = new Date(v)
    }
    return t instanceof Date && !isNaN(t)
}


export default isDate