Darabonba/Date.cs (167 lines of code) (raw):
using System;
using Darabonba.Exceptions;
namespace Darabonba
{
public class Date
{
private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public DateTime DateTime { get; private set; }
public Date(DateTime date)
{
DateTime = date;
}
public Date(string dateStr)
{
long timestamp;
DateTimeOffset dateTimeOffset;
if (long.TryParse(dateStr, out timestamp))
{
dateTimeOffset = Jan1st1970.AddSeconds(timestamp);
DateTime = dateTimeOffset.UtcDateTime;
}
// if no time zone, treat as local time as DateTimeOffset.Parse.
else if (DateTimeOffset.TryParse(dateStr, out dateTimeOffset))
{
DateTime = dateTimeOffset.UtcDateTime;
}
else
{
throw new DaraException
{
Message = dateStr + "is not a valid time string."
};
}
}
public string Format(string layout)
{
layout = layout.Replace('Y', 'y')
.Replace('D', 'd')
.Replace('h', 'H');
return DateTime.ToUniversalTime().ToString(layout);
}
public long Unix()
{
return (long)(DateTime.ToUniversalTime() - Jan1st1970).TotalSeconds;
}
public string UTC()
{
return DateTime.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss.ffffff '+0000 UTC'");
}
public Date Sub(string unit, int amount)
{
DateTime newDate;
switch (unit.ToLowerInvariant())
{
case "millisecond":
newDate = DateTime.AddMilliseconds(-amount);
break;
case "second":
newDate = DateTime.AddSeconds(-amount);
break;
case "minute":
newDate = DateTime.AddMinutes(-amount);
break;
case "hour":
newDate = DateTime.AddHours(-amount);
break;
case "day":
newDate = DateTime.AddDays(-amount);
break;
case "month":
newDate = DateTime.AddMonths(-amount);
break;
case "year":
newDate = DateTime.AddYears(-amount);
break;
default:
throw new ArgumentException("Unsupported unit.");
}
return new Date(newDate);
}
public Date Add(string unit, int amount)
{
DateTime newDate;
switch (unit.ToLowerInvariant())
{
case "millisecond":
newDate = DateTime.AddMilliseconds(amount);
break;
case "second":
newDate = DateTime.AddSeconds(amount);
break;
case "minute":
newDate = DateTime.AddMinutes(amount);
break;
case "hour":
newDate = DateTime.AddHours(amount);
break;
case "day":
newDate = DateTime.AddDays(amount);
break;
case "month":
newDate = DateTime.AddMonths(amount);
break;
case "year":
newDate = DateTime.AddYears(amount);
break;
default:
throw new ArgumentException("Unsupported unit.");
}
return new Date(newDate);
}
public int Diff(string unit, Date diffDate)
{
TimeSpan timeSpan = DateTime - diffDate.DateTime;
switch (unit.ToLowerInvariant())
{
case "millisecond":
return timeSpan.Milliseconds;
case "second":
return timeSpan.Seconds;
case "minute":
return timeSpan.Minutes;
case "hour":
return timeSpan.Hours;
case "day":
return timeSpan.Days;
case "month":
return timeSpan.Days / 30;
case "year":
return timeSpan.Days / 365;
default:
throw new ArgumentException("Unsupported unit.");
}
}
public int Hour()
{
return DateTime.Hour;
}
public int Minute()
{
return DateTime.Minute;
}
public int Second()
{
return DateTime.Second;
}
public int Month()
{
return DateTime.Month;
}
public int Year()
{
return DateTime.Year;
}
public int DayOfMonth()
{
return DateTime.Day;
}
public int DayOfWeek()
{
if (DateTime.DayOfWeek == 0)
{
return 7;
}
return (int)DateTime.DayOfWeek;
}
}
}