C# - How to subtract time from a DateTime or DateTimeOffset

You are likely looking for one of these two examples (using hours):

var dateTimeMinusOneHour = DateTime.Now.Subtract(TimeSpan.FromHours(1));
var dateTimeMinusOneHour = DateTime.Now.AddHours(-1);

I have always found it to be a bit backwards to use the .AddHours(-1) method for subtracting time from a DateTime. Using DateTime or DateTimeOffset you can subtract time (Milliseconds, Seconds, Hours, Days, Months, Years) by adding with a negative number:

var dateTimeMinusOneMs = DateTime.Now.AddMilliseconds(-1);
var dateTimeMinusOneSecond = DateTime.Now.AddSeconds(-1);
var dateTimeMinusOneMinute = DateTime.Now.AddMinutes(-1);
var dateTimeMinusOneHour = DateTime.Now.AddHours(-1);
var dateTimeMinusOneDay = DateTime.Now.AddDays(-1);
var dateTimeMinusOneMonth = DateTime.Now.AddMonths(-1);
var dateTimeMinusOneYear = DateTime.Now.AddYears(-1);

The same methods are available for the DateTimeOffset struct:

var dateTimeOffsetMinusOneMs = DateTimeOffset.Now.AddMilliseconds(-1);
var dateTimeOffsetMinusOneSecond = DateTimeOffset.Now.AddSeconds(-1);
var dateTimeOffsetMinusOneMinute = DateTimeOffset.Now.AddMinutes(-1);
var dateTimeOffsetMinusOneHour = DateTimeOffset.Now.AddHours(-1);
var dateTimeOffsetMinusOneDay = DateTimeOffset.Now.AddDays(-1);
var dateTimeOffsetMinusOneMonth = DateTimeOffset.Now.AddMonths(-1);
var dateTimeOffsetMinusOneYear = DateTimeOffset.Now.AddYears(-1);

Instead of using the .AddX() methods with a negative number you can instead use the subtract method with a TimeSpan which might look more natural:

var dateTimeMinusOneMs = DateTime.Now.Subtract(TimeSpan.FromMilliseconds(1));
var dateTimeMinusOneSecond = DateTime.Now.Subtract(TimeSpan.FromSeconds(1));
var dateTimeMinusOneMinute = DateTime.Now.Subtract(TimeSpan.FromMinutes(1));
var dateTimeMinusOneHour = DateTime.Now.Subtract(TimeSpan.FromHours(1));
var dateTimeMinusOneDay = DateTime.Now.Subtract(TimeSpan.FromDays(1));

These also work with DateTimeOffset as well:

var dateTimeOffsetMinusOneMs = DateTimeOffset.Now.Subtract(TimeSpan.FromMilliseconds(1));
var dateTimeOffsetMinusOneSecond = DateTimeOffset.Now.Subtract(TimeSpan.FromSeconds(1));
var dateTimeOffsetMinusOneMinute = DateTimeOffset.Now.Subtract(TimeSpan.FromMinutes(1));
var dateTimeOffsetMinusOneHour = DateTimeOffset.Now.Subtract(TimeSpan.FromHours(1));
var dateTimeOffsetMinusOneDay = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(1));

A big drawback of using .Subtract() is that it cannot create a timespan of a month. This is due to there not being a specific length of a month, it may be 28, 29, 30 or 31 days depending on the actual month. Therefore it is not possible to create a timespan that spans a month as you cannot define an actual size. The same applies to years.

That is it

I hope you found this helpful, please leave a comment down below! :)