Newer
Older
DNA / corlib / System / TimeSpan.cs
@Chris Bacon Chris Bacon on 21 Jan 2012 5 KB First commit
#if !LOCALTEST

using System.Text;
namespace System {
	public struct TimeSpan : IComparable, IComparable<TimeSpan>, IEquatable<TimeSpan> {

		public static readonly TimeSpan MaxValue = new TimeSpan(long.MaxValue);
		public static readonly TimeSpan MinValue = new TimeSpan(long.MinValue);
		public static readonly TimeSpan Zero = new TimeSpan(0L);

		public const long TicksPerDay = 864000000000L;
		public const long TicksPerHour = 36000000000L;
		public const long TicksPerMillisecond = 10000L;
		public const long TicksPerMinute = 600000000L;
		public const long TicksPerSecond = 10000000L;

		private long ticks;

		public TimeSpan(long ticks) {
			this.ticks = ticks;
		}

		public TimeSpan(int hours, int minutes, int seconds) {
			this.ticks = CalcTicks(0, hours, minutes, seconds, 0);
		}

		public TimeSpan(int days, int hours, int minutes, int seconds) {
			this.ticks = CalcTicks(days, hours, minutes, seconds, 0);
		}

		public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds) {
			this.ticks = CalcTicks(days, hours, minutes, seconds, milliseconds);
		}

		private static long CalcTicks(int days, int hours, int minutes, int seconds, int millis) {
			long t;
			t = (long)days * TicksPerDay +
				(long)hours * TicksPerHour + (long)minutes * TicksPerMinute +
				(long)seconds * TicksPerSecond + (long)millis * TicksPerMillisecond;
			return t;
		}

		public int Days {
			get {
				return (int)(this.ticks / TicksPerDay);
			}
		}

		public int Hours {
			get {
				return (int)((this.ticks % TicksPerDay) / TicksPerHour);
			}
		}

		public int Minutes {
			get {
				return (int)((this.ticks % TicksPerHour) / TicksPerMinute);
			}
		}

		public int Seconds {
			get {
				return (int)((this.ticks % TicksPerMinute) / TicksPerSecond);
			}
		}

		public int MilliSeconds {
			get {
				return (int)((this.ticks % TicksPerSecond) / TicksPerMillisecond);
			}
		}

		public long Ticks {
			get {
				return this.ticks;
			}
		}

		public double TotalDays {
			get {
				return ((double)this.ticks) / ((double)TicksPerDay);
			}
		}

		public double TotalHours {
			get {
				return ((double)this.ticks) / ((double)TicksPerHour);
			}
		}

		public double TotalMinutes {
			get {
				return ((double)this.ticks) / ((double)TicksPerMinute);
			}
		}

		public double TotalSeconds {
			get {
				return ((double)this.ticks) / ((double)TicksPerSecond);
			}
		}

		public double TotalMilliseconds {
			get {
				return ((double)this.ticks) / ((double)TicksPerMillisecond);
			}
		}

		public TimeSpan Add(TimeSpan ts) {
			return new TimeSpan(this.ticks + ts.ticks);
		}

		public TimeSpan Subtract(TimeSpan ts) {
			return new TimeSpan(this.ticks - ts.ticks);
		}

		public TimeSpan Negate(TimeSpan ts) {
			return new TimeSpan(-this.ticks);
		}

		public TimeSpan Duration() {
			return new TimeSpan(Math.Abs(this.ticks));
		}

		public static int Compare(TimeSpan t1, TimeSpan t2) {
			if (t1.ticks < t2.ticks) {
				return -1;
			}
			if (t1.ticks > t2.ticks) {
				return 1;
			}
			return 0;
		}

		#region IComparable Members

		public int CompareTo(object obj) {
			if (obj == null) {
				return 1;
			}
			if (!(obj is TimeSpan)) {
				throw new ArgumentException("Object must be a TimeSpan");
			}
			return Compare(this, (TimeSpan)obj);
		}

		#endregion

		#region IComparable<TimeSpan> Members

		public int CompareTo(TimeSpan x) {
			return Compare(this, x);
		}

		#endregion

		#region IEquatable<TimeSpan> Members

		public bool Equals(TimeSpan x) {
			return this.ticks == x.ticks;
		}

		#endregion

		public override int GetHashCode() {
			return this.ticks.GetHashCode();
		}

		public override bool Equals(object obj) {
			if (!(obj is TimeSpan)) {
				return false;
			}
			return this.ticks == ((TimeSpan)obj).ticks;
		}

		public static bool Equals(TimeSpan t1, TimeSpan t2) {
			return t1.ticks == t2.ticks;
		}

		public override string ToString() {
			StringBuilder sb = new StringBuilder(14);

			if (this.ticks < 0) {
				sb.Append('-');
			}
			if (this.Days != 0) {
				sb.Append(Math.Abs(this.Days));
				sb.Append('.');
			}
			sb.AppendFormat("{0:D2}:{1:D2}:{2:D2}",
				Math.Abs(this.Hours), Math.Abs(this.Minutes), Math.Abs(this.Seconds));
			if (this.MilliSeconds != 0) {
				sb.Append('.');
				sb.AppendFormat("{0:D7}", Math.Abs(this.MilliSeconds) * (int)TicksPerMillisecond);
			}

			return sb.ToString();
		}

		public static TimeSpan operator +(TimeSpan t1, TimeSpan t2) {
			return new TimeSpan(t1.ticks + t2.ticks);
		}

		public static TimeSpan operator -(TimeSpan t1, TimeSpan t2) {
			return new TimeSpan(t1.ticks - t2.ticks);
		}

		public static bool operator ==(TimeSpan t1, TimeSpan t2) {
			return t1.ticks == t2.ticks;
		}

		public static bool operator !=(TimeSpan t1, TimeSpan t2) {
			return t1.ticks != t2.ticks;
		}

		public static bool operator >(TimeSpan t1, TimeSpan t2) {
			return t1.ticks > t2.ticks;
		}

		public static bool operator >=(TimeSpan t1, TimeSpan t2) {
			return t1.ticks >= t2.ticks;
		}

		public static bool operator <(TimeSpan t1, TimeSpan t2) {
			return t1.ticks < t2.ticks;
		}

		public static bool operator <=(TimeSpan t1, TimeSpan t2) {
			return t1.ticks <= t2.ticks;
		}

		public static TimeSpan operator +(TimeSpan ts) {
			return ts;
		}

		public static TimeSpan operator -(TimeSpan ts) {
			return new TimeSpan(-ts.ticks);
		}
	}
}

#endif