using System; using Abp.Timing.Timezone; namespace Abp.Timing { /// /// A basic implementation of to store a date range with a timezone. /// Default timezone is UTC /// public class ZonedDateTimeRange : DateTimeRange, IZonedDateTimeRange { public ZonedDateTimeRange() { } public ZonedDateTimeRange(string timezone) { Timezone = timezone; } public ZonedDateTimeRange(IDateTimeRange dateTimeRange, string timeZoneId) : base(dateTimeRange) { Timezone = timeZoneId; } public ZonedDateTimeRange(IZonedDateTimeRange zonedDateTimeRange) : base(zonedDateTimeRange) { Timezone = zonedDateTimeRange.Timezone; } public ZonedDateTimeRange(DateTime startTime, DateTime endTime, string timeZoneId) : base(startTime, endTime) { Timezone = timeZoneId; } public ZonedDateTimeRange(DateTime startTime, TimeSpan timeSpan, string timeZoneId) : base(startTime, timeSpan) { Timezone = timeZoneId; } /// /// The Timezone of the datetime range /// public string Timezone { get; set; } = "UTC"; /// /// The StartTime with Offset /// public DateTimeOffset StartTimeOffset { get => TimezoneHelper.ConvertToDateTimeOffset(StartTime, Timezone); set => StartTimeUtc = value.UtcDateTime; } /// /// The EndTime with Offset /// public DateTimeOffset EndTimeOffset { get => TimezoneHelper.ConvertToDateTimeOffset(EndTime, Timezone); set => EndTimeUtc = value.UtcDateTime; } /// /// The StartTime in UTC /// public DateTime StartTimeUtc { get => StartTimeOffset.UtcDateTime; set { var localized = TimezoneHelper.ConvertFromUtc(value, Timezone); if (localized.HasValue) { StartTime = localized.Value; } } } /// /// The EndTime in UTC /// public DateTime EndTimeUtc { get => EndTimeOffset.UtcDateTime; set { var localized = TimezoneHelper.ConvertFromUtc(value, Timezone); if (localized.HasValue) { EndTime = localized.Value; } } } /// /// The current time based on the timezone /// public DateTime Now { get { DateTime? localTime; switch (Clock.Kind) { case DateTimeKind.Local: localTime = TimezoneHelper.ConvertFromUtc(Clock.Now.ToUniversalTime(), Timezone); break; case DateTimeKind.Unspecified: localTime = Clock.Now; break; case DateTimeKind.Utc: localTime = TimezoneHelper.ConvertFromUtc(Clock.Now, Timezone); break; default: throw new ArgumentOutOfRangeException(); } return localTime ?? Clock.Now; } } /// /// Gets a zoned date range representing yesterday. /// public new ZonedDateTimeRange Yesterday { get { var now = Now; return new ZonedDateTimeRange(now.Date.AddDays(-1), now.Date.AddMilliseconds(-1), Timezone); } } /// /// Gets a zoned date range representing today. /// public new ZonedDateTimeRange Today { get { var now = Now; return new ZonedDateTimeRange(now.Date, now.Date.AddDays(1).AddMilliseconds(-1), Timezone); } } /// /// Gets a zoned date range representing tomorrow. /// public new ZonedDateTimeRange Tomorrow { get { var now = Now; return new ZonedDateTimeRange(now.Date.AddDays(1), now.Date.AddDays(2).AddMilliseconds(-1), Timezone); } } /// /// Gets a zoned date range representing the last month. /// public new ZonedDateTimeRange LastMonth { get { var now = Now; var startTime = now.Date.AddDays(-now.Day + 1).AddMonths(-1); var endTime = startTime.AddMonths(1).AddMilliseconds(-1); return new ZonedDateTimeRange(startTime, endTime, Timezone); } } /// /// Gets a zoned date range representing this month. /// public new ZonedDateTimeRange ThisMonth { get { var now = Now; var startTime = now.Date.AddDays(-now.Day + 1); var endTime = startTime.AddMonths(1).AddMilliseconds(-1); return new ZonedDateTimeRange(startTime, endTime, Timezone); } } /// /// Gets a zoned date range representing the next month. /// public new ZonedDateTimeRange NextMonth { get { var now = Now; var startTime = now.Date.AddDays(-now.Day + 1).AddMonths(1); var endTime = startTime.AddMonths(1).AddMilliseconds(-1); return new ZonedDateTimeRange(startTime, endTime, Timezone); } } /// /// Gets a zoned date range representing the last year. /// public new ZonedDateTimeRange LastYear { get { var now = Now; return new ZonedDateTimeRange(new DateTime(now.Year - 1, 1, 1), new DateTime(now.Year, 1, 1).AddMilliseconds(-1), Timezone); } } /// /// Gets a zoned date range representing this year. /// public new ZonedDateTimeRange ThisYear { get { var now = Now; return new ZonedDateTimeRange(new DateTime(now.Year, 1, 1), new DateTime(now.Year + 1, 1, 1).AddMilliseconds(-1), Timezone); } } /// /// Gets a zoned date range representing the next year. /// public new ZonedDateTimeRange NextYear { get { var now = Now; return new ZonedDateTimeRange(new DateTime(now.Year + 1, 1, 1), new DateTime(now.Year + 2, 1, 1).AddMilliseconds(-1), Timezone); } } /// /// Gets a zoned date range representing the last 30 days (30x24 hours) including today. /// public ZonedDateTimeRange Last30Days { get { var now = Now; return new ZonedDateTimeRange(now.AddDays(-30), now, Timezone); } } /// /// Gets a zoned date range representing the last 30 days excluding today. /// public ZonedDateTimeRange Last30DaysExceptToday { get { var now = Now; return new ZonedDateTimeRange(now.Date.AddDays(-30), now.Date.AddMilliseconds(-1), Timezone); } } /// /// Gets a zoned date range representing the last 7 days (7x24 hours) including today. /// public ZonedDateTimeRange Last7Days { get { var now = Now; return new ZonedDateTimeRange(now.AddDays(-7), now, Timezone); } } /// /// Gets a zoned date range representing the last 7 days excluding today. /// public ZonedDateTimeRange Last7DaysExceptToday { get { var now = Now; return new ZonedDateTimeRange(now.Date.AddDays(-7), now.Date.AddMilliseconds(-1), Timezone); } } } }