Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
JavaScript

JavaScript: Why Comparing Two Dates With == Almost Never Works the Way You Expect

- 06.09.26 - ErcanOPAK

⚡ Why Comparing Two Dates With == Almost Never Does What You Expect

Two `Date` objects representing the exact same moment in time compare as NOT equal with `==` (or `===`) – which surprises people expecting date comparison to work like number or string comparison, because in JavaScript, `Date` is an object, and `==`/`===` between two objects compares REFERENCE identity, never their actual represented values.

🔎 The Problem

const d1 = new Date('"'"'2026-09-06T10:00:00Z'"'"');
const d2 = new Date('"'"'2026-09-06T10:00:00Z'"'"');

console.log(d1 == d2);    // false
console.log(d1 === d2);   // false

// Both represent the EXACT same instant, but they'"'"'re two separate
// object instances in memory - == and === only ever check "is this
// literally the same object reference", never "do these represent the
// same moment in time".

✅ Fix: Compare the Underlying Timestamp, Not the Objects

  • `d1.getTime() === d2.getTime()` (or the shorthand `+d1 === +d2`) compares the actual millisecond timestamp each `Date` wraps – this is the correct way to check if two dates represent the same moment.
  • For comparing whether one date is before/after another, use the relational operators directly on the Date objects (`d1 < d2`, `d1 > d2`) – unlike `==`, these DO trigger JavaScript’s implicit numeric conversion for Date objects and work correctly, which is a genuinely confusing asymmetry worth remembering.

⚠️ The Same Rule Applies to Any Object, Not Just Dates

  • This isn’t Date-specific behavior – `{} == {}` is also false for the identical reason, even with visually identical content, because object equality in JavaScript is always about reference, never structural content, unless you write that comparison yourself.
  • Libraries like `date-fns` or `Luxon` provide explicit `isEqual()`/comparison helpers that read more clearly than `.getTime()` calls scattered through a codebase, if date comparisons show up often enough to be worth the dependency.

Two dates can point at the exact same moment and still fail `==` – because JavaScript was never asked to compare moments, only to compare objects, and those are different questions.

— JavaScript Tip

Related posts:

JavaScript: Use Map and Set for Efficient Data Structures

JavaScript: Understand Hoisting

JavaScript: Master Map, Filter, Reduce for Arrays

Post Views: 2

Post navigation

Ajax: Fix a Request That Sends Stale Form Data Because of Event Timing
Docker: Fix a Container That Gets OOM-Killed Even Though the Host Has Memory Free

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (951)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (951)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com