Skip to content

Instantly share code, notes, and snippets.

@DarrenSem
Created November 6, 2022 20:02
Show Gist options
  • Save DarrenSem/f16e945baec67f77c660cbc005394c41 to your computer and use it in GitHub Desktop.
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'
// 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(),
});
// 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(),
});
@DarrenSem
Copy link
Author

DarrenSem commented May 16, 2024

// 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(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment