Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Run results for:
MomentJS VS Date VS Date-Fns - getTtlFromKey #3
Go to the benchmark
Embed
Embed Benchmark Result
Run details:
User agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
Browser:
Chrome 138
Operating system:
Mac OS X 10.15.7
Device Platform:
Desktop
Date tested:
9 months ago
Test name
Executions per second
MomentJS
122810.0 Ops/sec
Date JS
1484823.5 Ops/sec
Date-Fns
980322.1 Ops/sec
HTML Preparation code:
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.4/moment.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/date-fns/cdn.min.js"></script>
Script Preparation code:
function parseDateAsUtc(dateString) { // Check if the string already has a timezone indicator (Z or +/-HH:mm) const hasTimezoneIndicator = /[+-]\d{2}:\d{2}$|Z$/i.test(dateString); let fullIsoString = dateString; if (!hasTimezoneIndicator) { // If no timezone, we need to add 'Z' to ensure it's parsed as UTC. // We also need to fill in missing time components to make it a valid ISO string. // Example: '2025-07-18' -> '2025-07-18T00:00:00Z' // '2025-07-18T18' -> '2025-07-18T18:00:00Z' // '2025-07-18T18:30' -> '2025-07-18T18:30:00Z' // '2025-07-18T18:45:05' -> '2025-07-18T18:45:05Z' if (!dateString.includes('T')) { // If only date part, add T00:00:00Z fullIsoString += 'T00:00:00Z'; } else { // Has time part, but might be incomplete const [datePart, timePart] = dateString.split('T'); const parts = timePart.split(':'); let hours = parts[0] || '00'; let minutes = parts[1] || '00'; let seconds = parts[2] || '00'; fullIsoString = `${datePart}T${hours}:${minutes}:${seconds}Z`; } } // Use the native Date constructor, which is robust at parsing full ISO strings. // It will correctly interpret a string ending in 'Z' as UTC. return new Date(fullIsoString); }
Tests:
MomentJS
const cacheDurationMinutes = 60; const defaultTtl = cacheDurationMinutes * 60; const effectiveDate = '2025-07-18T18'; const now = moment.utc(); const keyEffectiveDateStart = moment.utc(effectiveDate); const keyEffectiveDateEnd = keyEffectiveDateStart.clone() .add(cacheDurationMinutes, 'minutes'); const secondsTillKeyEnd = keyEffectiveDateEnd.diff(now, 'seconds'); const result = Math.min(defaultTtl, Math.max(0, secondsTillKeyEnd)) || defaultTtl;
Date JS
const cacheDurationMinutes = 60; const defaultTtl = cacheDurationMinutes * 60; const effectiveDate = '2025-07-18T18'; const now = new Date(); const keyEffectiveDateStart = parseDateAsUtc(effectiveDate); const keyEffectiveDateEnd = new Date(keyEffectiveDateStart.getTime()); //keyEffectiveDateEnd.setUTCMinutes(keyEffectiveDateEnd.getUTCMinutes() + cacheDurationMinutes); const millisecondsInMinute = 60000; keyEffectiveDateEnd.setTime(keyEffectiveDateEnd.getTime() + cacheDurationMinutes * millisecondsInMinute); const secondsTillKeyEnd = (keyEffectiveDateEnd.getTime() - now.getTime()) / 1000; const result = Math.min(defaultTtl, Math.max(0, secondsTillKeyEnd)) || defaultTtl;
Date-Fns
const cacheDurationMinutes = 60; const defaultTtl = cacheDurationMinutes * 60; const effectiveDate = '2025-07-18T18'; const now = new Date(); const keyEffectiveDateStart = parseDateAsUtc(effectiveDate); const keyEffectiveDateEnd = dateFns.addMinutes(keyEffectiveDateStart, cacheDurationMinutes); const secondsTillKeyEnd = dateFns.differenceInSeconds(keyEffectiveDateEnd, now); const result = Math.min(defaultTtl, Math.max(0, secondsTillKeyEnd)) || defaultTtl;