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); } } }