Skip to content

Commit 8c7ac9d

Browse files
committed
Safe add and subtract values
1 parent 05212c9 commit 8c7ac9d

File tree

4 files changed

+113
-57
lines changed

4 files changed

+113
-57
lines changed

src/Exceptionless.DateTimeExtensions/DateTimeExtensions.cs

Lines changed: 54 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -173,59 +173,87 @@ public static DateTime StartOfSecond(this DateTime date) {
173173
}
174174

175175
public static DateTime EndOfSecond(this DateTime date) {
176-
return date.StartOfSecond().AddSeconds(1).SubtractMilliseconds(1);
176+
var value = date.StartOfSecond().SafeAdd(TimeSpan.FromSeconds(1));
177+
if (value == DateTime.MaxValue)
178+
return value;
179+
180+
return value.SubtractMilliseconds(1);
177181
}
178182

179183
public static DateTime StartOfMinute(this DateTime date) {
180184
return date.Floor(TimeSpan.FromMinutes(1));
181185
}
182186

183187
public static DateTime EndOfMinute(this DateTime date) {
184-
return date.StartOfMinute().AddMinutes(1).SubtractMilliseconds(1);
188+
var value = date.StartOfMinute().SafeAdd(TimeSpan.FromMinutes(1));
189+
if (value == DateTime.MaxValue)
190+
return value;
191+
192+
return value.SubtractMilliseconds(1);
185193
}
186194

187195
public static DateTime StartOfHour(this DateTime date) {
188196
return date.Floor(TimeSpan.FromHours(1));
189197
}
190198

191199
public static DateTime EndOfHour(this DateTime date) {
192-
return date.StartOfHour().AddHours(1).SubtractMilliseconds(1);
200+
var value = date.StartOfHour().SafeAdd(TimeSpan.FromHours(1));
201+
if (value == DateTime.MaxValue)
202+
return value;
203+
204+
return value.SubtractMilliseconds(1);
193205
}
194206

195207
public static DateTime StartOfDay(this DateTime date) {
196208
return date.Date;
197209
}
198210

199211
public static DateTime EndOfDay(this DateTime date) {
200-
return date.Date.AddDays(1).SubtractMilliseconds(1);
212+
var value = date.Date.SafeAdd(TimeSpan.FromDays(1));
213+
if (value == DateTime.MaxValue)
214+
return value;
215+
216+
return value.SubtractMilliseconds(1);
201217
}
202218

203219
public static DateTime StartOfWeek(this DateTime date, DayOfWeek startOfWeek = DayOfWeek.Sunday) {
204220
int diff = date.DayOfWeek - startOfWeek;
205221
if (diff < 0)
206222
diff += 7;
207223

208-
return date.Date.AddDays(-1 * diff);
224+
return date.Date.SafeSubtract(TimeSpan.FromDays(diff));
209225
}
210226

211227
public static DateTime EndOfWeek(this DateTime date, DayOfWeek startOfWeek = DayOfWeek.Sunday) {
212-
return date.StartOfWeek(startOfWeek).AddWeeks(1).SubtractMilliseconds(1);
228+
var value = date.StartOfWeek(startOfWeek).AddWeeks(1);
229+
if (value == DateTime.MaxValue)
230+
return value;
231+
232+
return value.SubtractMilliseconds(1);
213233
}
214234

215235
public static DateTime StartOfMonth(this DateTime date) {
216-
return date.Date.AddDays(1 - date.Date.Day);
236+
return date.Date.SafeSubtract(TimeSpan.FromDays(date.Date.Day - 1));
217237
}
218238

219239
public static DateTime EndOfMonth(this DateTime date) {
220-
return date.StartOfMonth().AddMonths(1).SubtractMilliseconds(1);
240+
var value = date.StartOfMonth().AddMonths(1);
241+
if (value == DateTime.MaxValue)
242+
return value;
243+
244+
return value.SubtractMilliseconds(1);
221245
}
222246

223247
public static DateTime StartOfYear(this DateTime date) {
224-
return date.Date.AddDays(1 - date.Date.Day).AddMonths(1 - date.Date.Month);
248+
return date.StartOfMonth().SubtractMonths(date.Date.Month - 1);
225249
}
226250

227251
public static DateTime EndOfYear(this DateTime date) {
228-
return date.StartOfYear().AddYears(1).SubtractMilliseconds(1);
252+
var value = date.StartOfYear().AddYears(1);
253+
if (value == DateTime.MaxValue)
254+
return value;
255+
256+
return value.SubtractMilliseconds(1);
229257
}
230258

231259
public static DateTime Floor(this DateTime date, TimeSpan interval) {
@@ -242,35 +270,35 @@ public static DateTime Round(this DateTime date, TimeSpan roundingInterval) {
242270
}
243271

244272
public static DateTime NextSecond(this DateTime date) {
245-
return date.AddSeconds(1);
273+
return date.SafeAdd(TimeSpan.FromSeconds(1));
246274
}
247275

248276
public static DateTime LastSecond(this DateTime date) {
249-
return date.SubtractSeconds(1);
277+
return date.SafeSubtract(TimeSpan.FromSeconds(1));
250278
}
251279

252280
public static DateTime NextMinute(this DateTime date) {
253-
return date.AddMinutes(1);
281+
return date.SafeAdd(TimeSpan.FromMinutes(1));
254282
}
255283

256284
public static DateTime LastMinute(this DateTime date) {
257-
return date.SubtractMinutes(1);
285+
return date.SafeSubtract(TimeSpan.FromMinutes(1));
258286
}
259287

260288
public static DateTime NextHour(this DateTime date) {
261-
return date.AddHours(1);
289+
return date.SafeAdd(TimeSpan.FromHours(1));
262290
}
263291

264292
public static DateTime LastHour(this DateTime date) {
265-
return date.SubtractHours(1);
293+
return date.SafeSubtract(TimeSpan.FromHours(1));
266294
}
267295

268296
public static DateTime NextDay(this DateTime date) {
269-
return date.AddDays(1);
297+
return date.SafeAdd(TimeSpan.FromDays(1));
270298
}
271299

272300
public static DateTime LastDay(this DateTime date) {
273-
return date.SubtractDays(1);
301+
return date.SafeSubtract(TimeSpan.FromDays(1));
274302
}
275303

276304
public static DateTime NextWeek(this DateTime date) {
@@ -301,53 +329,53 @@ public static DateTime SubtractTicks(this DateTime date, long value) {
301329
if (value < 0)
302330
throw new ArgumentException("Value cannot be less than 0.", nameof(value));
303331

304-
return date.AddTicks(value * -1);
332+
return date.SafeSubtract(TimeSpan.FromTicks(value));
305333
}
306334

307335
public static DateTime SubtractMilliseconds(this DateTime date, double value) {
308336
if (value < 0)
309337
throw new ArgumentException("Value cannot be less than 0.", nameof(value));
310338

311-
return date.AddMilliseconds(value * -1);
339+
return date.SafeSubtract(TimeSpan.FromMilliseconds(value));
312340
}
313341

314342
public static DateTime SubtractSeconds(this DateTime date, double value) {
315343
if (value < 0)
316344
throw new ArgumentException("Value cannot be less than 0.", nameof(value));
317345

318-
return date.AddSeconds(value * -1);
346+
return date.SafeSubtract(TimeSpan.FromSeconds(value));
319347
}
320348

321349
public static DateTime SubtractMinutes(this DateTime date, double value) {
322350
if (value < 0)
323351
throw new ArgumentException("Value cannot be less than 0.", nameof(value));
324352

325-
return date.AddMinutes(value * -1);
353+
return date.SafeSubtract(TimeSpan.FromMinutes(value));
326354
}
327355

328356
public static DateTime SubtractHours(this DateTime date, double value) {
329357
if (value < 0)
330358
throw new ArgumentException("Value cannot be less than 0.", nameof(value));
331359

332-
return date.AddHours(value * -1);
360+
return date.SafeSubtract(TimeSpan.FromHours(value));
333361
}
334362

335363
public static DateTime SubtractDays(this DateTime date, double value) {
336364
if (value < 0)
337365
throw new ArgumentException("Value cannot be less than 0.", nameof(value));
338366

339-
return date.AddDays(value * -1);
367+
return date.SafeSubtract(TimeSpan.FromDays(value));
340368
}
341369

342370
public static DateTime AddWeeks(this DateTime date, double value) {
343-
return date.AddDays(value * 7);
371+
return date.SafeAdd(TimeSpan.FromDays(value * 7));
344372
}
345373

346374
public static DateTime SubtractWeeks(this DateTime date, double value) {
347375
if (value < 0)
348376
throw new ArgumentException("Value cannot be less than 0.", nameof(value));
349377

350-
return date.AddWeeks(value * -1);
378+
return date.SafeSubtract(TimeSpan.FromDays(value * 7));
351379
}
352380

353381
public static DateTime SubtractMonths(this DateTime date, int months) {

0 commit comments

Comments
 (0)