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