using System;
namespace Abp.Timing
{
///
/// A basic implementation of to store a date range.
///
[Serializable]
public class DateTimeRange : IDateTimeRange
{
///
/// Start time of the datetime range.
///
public DateTime StartTime { get; set; }
///
/// End time of the datetime range.
///
public DateTime EndTime { get; set; }
///
/// Gets the time span of the datetime range.
/// When set, EndTime is recalculated
///
public TimeSpan TimeSpan
{
get => EndTime - StartTime;
set => EndTime = StartTime.Add(value);
}
private static DateTime Now => Clock.Now;
///
/// Creates a new object.
///
public DateTimeRange()
{
}
///
/// Creates a new object from the given and .
///
/// Start time of the datetime range
/// End time of the datetime range
public DateTimeRange(DateTime startTime, DateTime endTime)
{
StartTime = startTime;
EndTime = endTime;
}
///
/// Creates a new object from the given and .
///
/// Start time of the datetime range
/// The span of time to calculate the EndTime
public DateTimeRange(DateTime startTime, TimeSpan timeSpan)
{
StartTime = startTime;
TimeSpan = timeSpan;
}
///
/// Creates a new object from given the object.
///
/// IDateTimeRange object
public DateTimeRange(IDateTimeRange dateTimeRange)
{
StartTime = dateTimeRange.StartTime;
EndTime = dateTimeRange.EndTime;
}
///
/// Gets a date range representing yesterday.
///
public static DateTimeRange Yesterday
{
get
{
var now = Now;
return new DateTimeRange(now.Date.AddDays(-1), now.Date.AddMilliseconds(-1));
}
}
///
/// Gets a date range representing today.
///
public static DateTimeRange Today
{
get
{
var now = Now;
return new DateTimeRange(now.Date, now.Date.AddDays(1).AddMilliseconds(-1));
}
}
///
/// Gets a date range representing tomorrow.
///
public static DateTimeRange Tomorrow
{
get
{
var now = Now;
return new DateTimeRange(now.Date.AddDays(1), now.Date.AddDays(2).AddMilliseconds(-1));
}
}
///
/// Gets a date range representing the last month.
///
public static DateTimeRange LastMonth
{
get
{
var now = Now;
var startTime = now.Date.AddDays(-now.Day + 1).AddMonths(-1);
var endTime = startTime.AddMonths(1).AddMilliseconds(-1);
return new DateTimeRange(startTime, endTime);
}
}
///
/// Gets a date range representing this month.
///
public static DateTimeRange ThisMonth
{
get
{
var now = Now;
var startTime = now.Date.AddDays(-now.Day + 1);
var endTime = startTime.AddMonths(1).AddMilliseconds(-1);
return new DateTimeRange(startTime, endTime);
}
}
///
/// Gets a date range representing the next month.
///
public static DateTimeRange NextMonth
{
get
{
var now = Now;
var startTime = now.Date.AddDays(-now.Day + 1).AddMonths(1);
var endTime = startTime.AddMonths(1).AddMilliseconds(-1);
return new DateTimeRange(startTime, endTime);
}
}
///
/// Gets a date range representing the last year.
///
public static DateTimeRange LastYear
{
get
{
var now = Now;
return new DateTimeRange(new DateTime(now.Year - 1, 1, 1), new DateTime(now.Year, 1, 1).AddMilliseconds(-1));
}
}
///
/// Gets a date range representing this year.
///
public static DateTimeRange ThisYear
{
get
{
var now = Now;
return new DateTimeRange(new DateTime(now.Year, 1, 1), new DateTime(now.Year + 1, 1, 1).AddMilliseconds(-1));
}
}
///
/// Gets a date range representing the next year.
///
public static DateTimeRange NextYear
{
get
{
var now = Now;
return new DateTimeRange(new DateTime(now.Year + 1, 1, 1), new DateTime(now.Year + 2, 1, 1).AddMilliseconds(-1));
}
}
///
/// Gets a date range representing the last 30 days (30x24 hours) including today.
///
public static DateTimeRange Last30Days
{
get
{
var now = Now;
return new DateTimeRange(now.AddDays(-30), now);
}
}
///
/// Gets a date range representing the last 30 days excluding today.
///
public static DateTimeRange Last30DaysExceptToday
{
get
{
var now = Now;
return new DateTimeRange(now.Date.AddDays(-30), now.Date.AddMilliseconds(-1));
}
}
///
/// Gets a date range representing the last 7 days (7x24 hours) including today.
///
public static DateTimeRange Last7Days
{
get
{
var now = Now;
return new DateTimeRange(now.AddDays(-7), now);
}
}
///
/// Gets a date range representing the last 7 days excluding today.
///
public static DateTimeRange Last7DaysExceptToday
{
get
{
var now = Now;
return new DateTimeRange(now.Date.AddDays(-7), now.Date.AddMilliseconds(-1));
}
}
///
/// Returns a that represents the current .
///
/// A that represents the current .
public override string ToString()
{
return string.Format("[{0} - {1}]", StartTime, EndTime);
}
}
}