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
C#

DateTime.Now Breaks Distributed Logic

- 03.01.26 | 03.01.26 - ErcanOPAK

Same code, different results.

Why
Local time zones and daylight saving.

Fix

DateTimeOffset.UtcNow

 

πŸ”₯ Why DateTime.Now Breaks Distributed Logic (And What to Use Instead)

Same code. Different results.
If you’ve ever seen time-based logic randomly fail in production, DateTime.Now might be the silent culprit.

In distributed systems, local time is a trap.


🚨 The Core Problem

DateTime.Now returns the local time of the machine it runs on.

That means:

  • Different servers β†’ different time zones

  • Daylight Saving Time (DST) changes β†’ time jumps forward or backward

  • Same request β†’ different results

In modern architectures (APIs, background workers, microservices), this breaks deterministic logic.


πŸ’₯ Real-World Failure Example

Token expiration logic

var expiresAt = DateTime.Now.AddMinutes(30);

Later, on another server:

if (DateTime.Now > token.ExpiresAt)
{
    // Token expired
}

βœ” Works sometimes
❌ Randomly fails in production

Why?
Because each server evaluates β€œnow” differently.


πŸ•’ Daylight Saving Time: The Hidden Time Bomb

During DST transitions, clocks can:

  • Jump forward (missing time)

  • Go backward (duplicate time)

This can cause:

  • Scheduled jobs running twice

  • Time comparisons going backward

  • Logs appearing out of order

Time should never move backward in backend logic β€” but local time does.


❌ Why DateTime.Now Is Dangerous

  • Depends on server configuration

  • Affected by DST

  • Impossible to reliably test

  • Breaks distributed consistency


βœ… The Golden Rule

Use UTC everywhere on the backend.
Convert to local time only at the UI layer.


🟒 The Correct Approach

Use UTC

DateTime.UtcNow

Safe comparison

if (DateTime.UtcNow > expiresAtUtc)
{
    // Deterministic and safe
}

⭐ Even Better: DateTimeOffset

DateTimeOffset.UtcNow

Why it’s superior:

  • Stores UTC + offset

  • Time-zone aware

  • Ideal for distributed systems and databases


🧠 Professional Tip: Abstract Time

Avoid calling time directly.

public interface IClock
{
    DateTime UtcNow { get; }
}

This gives you:

  • Testability

  • Predictability

  • Clean architecture


🧾 TL;DR

❌ DateTime.Now
βœ” Breaks distributed logic

βœ… DateTime.UtcNow
βœ” Backend standard

βœ… DateTimeOffset
βœ” Enterprise-grade time handling


If your system runs on more than one machine, local time is a bug β€” not a feature.

Related posts:

How to run code if not in Debug Mode in C#

LINQ ToList() β€” The Performance Trap

How to calculate difference (number of days) between two dates in C#

Post Views: 8

Post navigation

LINQ Looks Clean but Allocates Heavily
Visual Studio Shows No Errors but App Won’t Start

Leave a Reply Cancel reply

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

April 2026
M T W T F S S
 12345
6789101112
13141516171819
20212223242526
27282930  
« Mar    

Most Viewed Posts

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

Recent Posts

  • C#: Use Init-Only Setters for Immutable Objects After Construction
  • C#: Use Expression-Bodied Members for Concise Single-Line Methods
  • C#: Enable Nullable Reference Types to Eliminate Null Reference Exceptions
  • C#: Use Record Types for Immutable Data Objects
  • SQL: Use CTEs for Readable Complex Queries
  • SQL: Use Window Functions for Advanced Analytical Queries
  • .NET Core: Use Background Services for Long-Running Tasks
  • .NET Core: Use Minimal APIs for Lightweight HTTP Services
  • Git: Use Cherry-Pick to Apply Specific Commits Across Branches
  • Git: Use Interactive Rebase to Clean Up Commit History Before Merge

Most Viewed Posts

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

Recent Posts

  • C#: Use Init-Only Setters for Immutable Objects After Construction
  • C#: Use Expression-Bodied Members for Concise Single-Line Methods
  • C#: Enable Nullable Reference Types to Eliminate Null Reference Exceptions
  • C#: Use Record Types for Immutable Data Objects
  • SQL: Use CTEs for Readable Complex Queries

Social

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