Skip to main content

How to Convert a JavaScript Date to .NET Ticks

When working in a mixed environment where a JavaScript front-end communicates with a .NET back-end, you may need to convert a JavaScript Date object into a format that the .NET framework understands natively. One such format is .NET Ticks, a high-precision time measurement.

This guide will explain what .NET Ticks are, teach you the correct formula for converting a JavaScript Date to ticks, and provide a reusable function to perform the conversion. We will also cover the reverse operation for full interoperability.

What are .NET Ticks?

A ".NET Tick" is the fundamental unit of time measurement in the Microsoft .NET Framework. It is a 64-bit integer that represents the number of 100-nanosecond intervals that have elapsed since 00:00:00, January 1, 0001. This starting point is known as the .NET Epoch.

The Core Concepts: Ticks, Epochs, and the Offset

The key to the conversion is understanding the difference between the JavaScript and .NET time systems.

SystemUnitEpoch (Starting Point)
JavaScript DateMillisecondsThe Unix Epoch (Jan 1, 1970)
.NET Ticks100-nanosecond intervalsThe .NET Epoch (Jan 1, 0001)

To convert from a JavaScript Date to .NET Ticks, we must perform two transformations:

  1. Convert Units: Change the JavaScript milliseconds into 100-nanosecond intervals. (There are 10,000 ticks in 1 millisecond).
  2. Add the Epoch Offset: Account for the vast time difference between the .NET Epoch (0001) and the Unix Epoch (1970).

The Solution: Converting a Date to Ticks

This function encapsulates the conversion logic and makes it reusable.

Problem: you have a JavaScript Date object and need to send its value to a .NET API that expects a long representing ticks.

// Problem: How to convert this Date object to .NET Ticks?
const myDate = new Date('2023-10-27T10:00:00Z');

Solution:

function dateToTicks(date) {
// The number of ticks for the "Unix Epoch" (January 1, 1970)
const epochOffset = 621355968000000000;

// There are 10,000 ticks in a millisecond.
const ticksPerMillisecond = 10000;

// Get the milliseconds from the Unix Epoch
const jsMillis = date.getTime();

// Convert to ticks and add the epoch offset.
return (jsMillis * ticksPerMillisecond) + epochOffset;
}

// Example Usage:
const myDate = new Date('2023-10-27T10:00:00Z'); // Using UTC for consistency
const ticks = dateToTicks(myDate);

console.log(ticks); // Output: 638339976000000000

Bonus: Converting Ticks back to a Date

For full interoperability, you also need a function to convert a long value for ticks from a .NET API back into a JavaScript Date object. This is simply the reverse of the previous formula.

function ticksToDate(ticks) {
const epochOffset = 621355968000000000;
const ticksPerMillisecond = 10000;

// Subtract the offset and convert back to milliseconds
const jsMillis = (ticks - epochOffset) / ticksPerMillisecond;

return new Date(jsMillis);
}

// Example Usage (proving the logic works both ways):
const originalTicks = 638339880000000000;
const myDate = ticksToDate(originalTicks);

console.log(myDate.toUTCString()); // Output: Fri, 27 Oct 2023 07:20:00 GMT

Practical Example: Preparing Data for a .NET API

A common use case is serializing a JavaScript object to send to a .NET back-end.

function dateToTicks(date) {
const epochOffset = 621355968000000000;
const ticksPerMillisecond = 10000;
const jsMillis = date.getTime();
return (jsMillis * ticksPerMillisecond) + epochOffset;
}

const appointment = {
title: 'Project Kickoff Meeting',
startTime: new Date('2023-11-15T14:00:00Z'),
attendees: ['Alice', 'Bob']
};

// Convert the date to ticks before sending
const dataForApi = {
...appointment,
startTime: dateToTicks(appointment.startTime)
};

console.log(JSON.stringify(dataForApi, null, 2));

Output:

{
"title": "Project Kickoff Meeting",
"startTime": 638356536000000000,
"attendees": [
"Alice",
"Bob"
]
}
note

This payload is now in a format that a .NET API can easily deserialize.

Conclusion

Converting between JavaScript Date objects and .NET Ticks is a straightforward mathematical operation once you understand the two key differences between the systems.

  • Difference in Epoch: JavaScript's Date starts from the Unix Epoch (1970), while .NET Ticks start from January 1, 0001.
  • Difference in Unit: JavaScript measures in milliseconds, while .NET Ticks measure in 100-nanosecond intervals.

The formula for converting a Date to Ticks is: ticks = (date.getTime() * 10000) + 621355968000000000;

By using this formula, you can ensure seamless interoperability when sending date and time information between JavaScript and .NET applications.