Created
November 6, 2022 20:02
-
-
Save DarrenSem/f16e945baec67f77c660cbc005394c41 to your computer and use it in GitHub Desktop.
dtString.js (dateArg, includeTime, defaultDate, defaultReturnValue) '1-2-2022 1:00' returns '02Jan2022 100am' or '02Jan2022'
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// dtString.js (dateArg, includeTime, defaultDate, defaultReturnValue) '1-2-2022 1:00' returns '02Jan2022 100am' or '02Jan2022' | |
const assert=(...a)=>!a.reduce((b,c,d,e,f)=>(f=("function"==typeof c?!c():!c)&&[2>a.length?c:`<arg #${d+1}> ${a.map((a,b)=>`#${b+1} = [ ${a} ]`).join(" , ")}`],f&&console.assert(0,...b[b.push(f)-1]),b),a.length?[]:[a]).length; | |
const assertMessage = (test, ...messageAndSubstitutions) => assert(test) || console.error(...messageAndSubstitutions) || false; | |
console.clear(); | |
// 183 chars: const dtString=(a,b,c,e,f=new Date(a),[,,,,g,h,,i]=(f=+f?f:new Date(c)).toLocaleString().toLowerCase().split(/\W/),[,j,k,d]=f.toString().split(" "))=>isNaN(f)?e:`${k}${j}${d}${b?` ${g}${h}${i}`:""}` | |
const dtString = (dateArg, includeTime, defaultDate, defaultReturnValue, z = new Date(dateArg), [, , , , h, n, , ampm] = (z = +z ? z : new Date(defaultDate)).toLocaleString().toLowerCase().split(/\W/), [, m, d, y] = z.toString().split(" ")) => isNaN(z) ? defaultReturnValue : `${d}${m}${y}${includeTime ? ` ${h}${n}${ampm}` : ""}`; | |
// ( ^ single-line version (USE THAT!) of...) | |
// 183 chars: const dtString_minifies_smaller=(a,b,c,e,f=new Date(a),[,,,,g,h,,i]=(f=+f?f:new Date(c)).toLocaleString().toLowerCase().split(/\W/),[,j,k,d]=f.toString().split(" "))=>isNaN(f)?e:`${k}${j}${d}${b?` ${g}${h}${i}`:""}` | |
const dtString_minifies_smaller = ( // dtString("bad", true, "", "fail") === "fail", dtString("bad", 0, Date.now()) === "05Nov2022" | |
dateArg, // = undefined or {} | |
includeTime, // = false | |
defaultDate, // = undefined or {} | |
defaultReturnValue, // = "" | |
z = new Date(dateArg), | |
[, , , , h, n, , ampm] = (z = +z ? z : new Date(defaultDate)).toLocaleString().toLowerCase().split(/\W/), | |
[, m, d, y] = z.toString().split(" ") | |
) => isNaN(z) ? defaultReturnValue : `${d}${m}${y}${includeTime ? ` ${h}${n}${ampm}` : ""}`; | |
// ( ^ via...) | |
// 200 chars: const dtString_clear=(a,b,c,e)=>{let f=new Date(a||{}),[,,,,g,h,,i]=(f=+f?f:new Date(c)).toLocaleString().toLowerCase().split(/\W/),[,j,k,d]=f.toString().split(" ");return isNaN(f)?e:`${k}${j}${d}${b?` ${g}${h}${i}`:""}`} | |
const dtString_clear = ( // dtString("bad", true, "", "fail") === "fail", dtString("bad", 0, Date.now()) === "05Nov2022" | |
dateArg, // = undefined or {} | |
includeTime, // = false | |
defaultDate, // = undefined or {} | |
defaultReturnValue, // = "" | |
) => { | |
let z = new Date(dateArg || {}), | |
[, , , , h, n, , ampm] = (z = +z ? z : new Date(defaultDate)).toLocaleString().toLowerCase().split(/\W/), | |
[, m, d, y] = z.toString().split(" ") | |
return isNaN(z) ? defaultReturnValue : `${d}${m}${y}${includeTime ? ` ${h}${n}${ampm}` : ""}`; | |
}; | |
const dtString_tests = () => { | |
let pass = true; | |
// const dtStringFunc = dtString_clear; | |
// const dtStringFunc = dtString_minifies_smaller; | |
const dtStringFunc = dtString; | |
pass = assertMessage(() => dtStringFunc('1-2-2022 1:00') === "02Jan2022") && pass; | |
pass = assertMessage(() => dtStringFunc('1-2-2022 1:00', true) === "02Jan2022 100am") && pass; | |
const date = new Date("02 Jan 1973 12:02:04"); | |
pass = assertMessage(() => +date === 94849324000, +date) && pass; | |
const dateString = date.toString(); | |
pass = assertMessage(() => dateString === "Tue Jan 02 1973 12:02:04 GMT-0700 (Mountain Standard Time)", {dateString}) && pass; | |
const [, m, d, y] = dateString.split(" "); | |
pass = assertMessage(() => m === "Jan" && d === "02" && y === "1973", {m, d, y, dateString}) && pass; | |
const [, , , , h, n, , ampm] = date.toLocaleString().toLowerCase().split(/\W/); | |
pass = assertMessage(() => h === "12" && n === "02" && ampm === "pm", {h, n, ampm, dateString}) && pass; | |
const dateOnly = `${d}${m}${y}`; | |
pass = assertMessage(() => dateOnly === "02Jan1973", {dateOnly}) && pass; | |
const includingTime = `${dateOnly} ${h}${n}${ampm}`; | |
pass = assertMessage(() => includingTime === "02Jan1973 1202pm", {includingTime}) && pass; | |
const includeTime = true; | |
const resultIncludingTime = `${dateOnly}${includeTime ? ` ${h}${n}${ampm}` : ""}`; | |
pass = assertMessage(() => resultIncludingTime === "02Jan1973 1202pm", {resultIncludingTime}) && pass; | |
const finalDateOnly = dtStringFunc(date); | |
pass = assertMessage(() => finalDateOnly === "02Jan1973", {finalDateOnly}) && pass; | |
const finalIncludingTime = dtStringFunc(date, true); | |
pass = assertMessage(() => finalIncludingTime === "02Jan1973 1202pm", {finalIncludingTime}) && pass; | |
pass = assert( | |
() => dtStringFunc(new Date("02/Jan/2022 1:02 pm")) === "02Jan2022", | |
() => dtStringFunc("02jAn2022 1:02 pM") === "02Jan2022", | |
() => dtStringFunc("2022-Jan 02", true) === "02Jan2022 1200am", | |
() => dtStringFunc("Jan02,22 1:02 PM", 1) === "02Jan2022 102pm", | |
() => dtStringFunc("42Jan2022", true) === undefined, | |
() => dtStringFunc("42Jan2022", false, Date.now()) === "06Nov2022", | |
() => dtStringFunc("42Jan2022", false, "Date.now()") === undefined, | |
() => dtStringFunc("42Jan2022", false, "Date.now()", "defaultDateFailed") === "defaultDateFailed", | |
) && pass; | |
return pass; | |
}; | |
console.log({ | |
dtString_tests: dtString_tests(), | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// dtStringTeamsChatLog.js (dateArg) '1-2-2022 1:00' returns '2022/01/02 1:00 AM' (no 'dateOnly' version) | |
const assert=(...a)=>!a.reduce((b,c,d,e,f)=>(f=("function"==typeof c?!c():!c)&&[2>a.length?c:`<arg #${d+1}> ${a.map((a,b)=>`#${b+1} = [ ${a} ]`).join(" , ")}`],f&&console.assert(0,...b[b.push(f)-1]),b),a.length?[]:[a]).length; | |
const assertMessage = (test, ...messageAndSubstitutions) => assert(test) || console.error(...messageAndSubstitutions) || false; | |
console.clear(); | |
// 183 chars: const dtStringTeamsChatLog=(a,b=new Date(a||Date()),[c,e,,f]=b.toLocaleTimeString().split(/\W/),[,,g,d]=b.toString().split(" "),h=b.toLocaleString().split("/")[0].padStart(2,0))=>`${d}/${h}/${g} ${c}:${e} ${f}` | |
const dtStringTeamsChatLog = (dateArg, date = new Date(dateArg || Date()), [h, n, , ampm] = date.toLocaleTimeString().split(/\W/), [, , d, y] = date.toString().split(" "), m = date.toLocaleString().split("/")[0].padStart(2,0)) => `${y}/${m}/${d} ${h}:${n} ${ampm}`; | |
// ( ^ single-line version (USE THAT!) of the "clear" version -- which minifies slightly larger...) | |
// 228 chars: const dtStringTeamsChatLog_clear=a=>{const b=new Date(a||Date()),[c,e,,f]=b.toLocaleTimeString().split(/\W/),[,,g,d]=b.toString().split(" "),h=b.toLocaleString().split("/")[0].padStart(2,0);return`${d}/${h}/${g} ${c}:${e} ${f}`} | |
const dtStringTeamsChatLog_clear = dateArg => { // dtStringTeamsChatLog("02 Jan 1973 12:02:04") === "1973/01/02 12:02 PM" | |
const date = new Date(dateArg || Date()); | |
const [h, n, , ampm] = date.toLocaleTimeString().split(/\W/); | |
const [, , d, y] = date.toString().split(" "); | |
const m = date.toLocaleString().split("/")[0].padStart(2,0); // new Date("02 Jan 1973").toLocaleString().split("/")[0].padStart(2,0) // new Date("02 Jan 1973").toLocaleString().split("/")[0] is shorter than new Date("02 Jan 1973").toLocaleString().match(/(\d+)\//)[1] | |
return `${y}/${m}/${d} ${h}:${n} ${ampm}`; | |
}; | |
const dtStringTeamsChatLog_tests = () => { | |
let pass = true; | |
// const dtStringTeamsChatLogFunc = dtStringTeamsChatLog_clear; | |
const dtStringTeamsChatLogFunc = dtStringTeamsChatLog; | |
pass = assertMessage(() => dtStringTeamsChatLogFunc('1-2-2022 1:00') === "2022/01/02 1:00 AM") && pass; | |
const now = new Date; | |
const nowStringTeamsChatLog = dtStringTeamsChatLog(now); | |
pass = assert( | |
() => dtStringTeamsChatLogFunc("") === nowStringTeamsChatLog, | |
() => dtStringTeamsChatLogFunc(+new Date) === nowStringTeamsChatLog, | |
) && pass; | |
pass = assert( | |
() => dtStringTeamsChatLogFunc("02 Jan 1973 12:02:04") === "1973/01/02 12:02 PM", | |
) && pass; | |
const date = new Date("02 Jan 1973 12:02:04"); | |
pass = assertMessage(() => +date === 94849324000, +date) && pass; | |
const dateString = date.toString(); | |
pass = assertMessage(() => dateString === "Tue Jan 02 1973 12:02:04 GMT-0700 (Mountain Standard Time)", {dateString}) && pass; | |
const [h, n, , ampm] = date.toLocaleTimeString().split(/\W/); | |
pass = assertMessage(() => h === "12" && n === "02" && ampm === "PM", {h, n, ampm, dateString}) && pass; | |
const [, , d, y] = dateString.split(" "); | |
const m = date.toLocaleString().split("/")[0].padStart(2,0); // new Date("02 Jan 1973").toLocaleString().split("/")[0].padStart(2,0) // new Date("02 Jan 1973").toLocaleString().split("/")[0] is shorter than new Date("02 Jan 1973").toLocaleString().match(/(\d+)\//)[1] | |
pass = assertMessage(() => m === "01" && d === "02" && y === "1973", {m, d, y, dateString}) && pass; | |
const dateOnly = `${y}/${m}/${d}`; | |
pass = assertMessage(() => dateOnly === "1973/01/02", {dateOnly}) && pass; | |
const timePart = "12:02 PM"; | |
const includingTime = `${dateOnly} ${h}:${n} ${ampm}`; | |
pass = assertMessage(() => includingTime === `1973/01/02 ${timePart}`, {includingTime}) && pass; | |
const includeTime = true; | |
const resultIncludingTime = `${dateOnly}${includeTime ? ` ${h}:${n} ${ampm}` : ""}`; | |
pass = assertMessage(() => resultIncludingTime === `1973/01/02 ${timePart}`, {resultIncludingTime}) && pass; | |
const finalDateOnly = dtStringTeamsChatLogFunc(date); // for TeamsChatLog, no such thing as "dateOnly" | |
pass = assertMessage(() => finalDateOnly === `1973/01/02 ${timePart}`, {finalDateOnly}) && pass; | |
const finalIncludingTime = dtStringTeamsChatLogFunc(date); | |
pass = assertMessage(() => finalIncludingTime === `1973/01/02 ${timePart}`, {finalIncludingTime}) && pass; | |
pass = assert( | |
() => dtStringTeamsChatLogFunc(new Date("02/Jan/2022 1:02 pm")) === "2022/01/02 1:02 PM", | |
() => dtStringTeamsChatLogFunc("02jAn2022 1:02 pM") === "2022/01/02 1:02 PM", | |
) && pass; | |
return pass; | |
}; | |
console.log({ | |
dtStringTeamsChatLog_tests: dtStringTeamsChatLog_tests(), | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
// BUGFIX 16May2024: MS EDGE toLocaleString() MIGHT END WITH 'a.m.' OR 'p.m.'(!)
// change this (BUG)
//
.toLocale[Date]String()[.toLowerCase()].split(/[\W]/)
// ...to this: (FIX)
//
.toLocale[Date]String().replace(/(a|p)\.(m)\./i, "$1$2")[.toLowerCase()].split(/[\W]/)
// And ALSO this:
...toLocaleString().replace(/(\d+)-(\d+)-(\d+)/, "$2/$1/$3").split("/")[0].padStart(...
// [ , , , , h, n, , ampm ] = _result.toLocaleString().replace(/(a|p).(m)./i, "$1$2").toLowerCase().split(/\W/); // Edge .toLocaleString() ends with "p.m." instead of "pm" (!)
// And ALSO change this (BUG) // Edge .toLocaleString() might be '2024-05-16' instead of '5/16/2024'
//
.toLocaleString().split("/")[0].padStart(
// ..to this: (FIX)
//
.toLocaleString().replace(/(\d+)-(\d+)-(\d+)/,"$2/$3/$1").split("/")[0].padStart(