internal Iso8601Time Add(Iso8601Duration duration) { DesignByContract.Check.Require(duration != null, "duration must not be null."); Iso8601Time newTime = new Iso8601Time(this.ToString()); Iso8601Duration normalisedDuration = Iso8601Duration.Normalise(duration); if (normalisedDuration.FractionalSecond > 0) { if (newTime.SecondUnknown) { throw new NotSupportedException("Cannot add a duration with fractionalSeconds when the datetime seconds unknow."); } if (newTime.HasFractionalSecond) { newTime.fractionalSecond += normalisedDuration.FractionalSecond; NormaliseFractionalSecond(newTime); } else { newTime.fractionalSecond = normalisedDuration.FractionalSecond; } } if (normalisedDuration.Seconds > 0) { if (newTime.SecondUnknown) { throw new NotSupportedException("Cannot add a duration with seconds when the time seconds unknow."); } newTime.second += normalisedDuration.Seconds; NormaliseSecond(newTime); } if (normalisedDuration.Minutes > 0) { if (newTime.MinuteUnknown) { throw new NotSupportedException("Cannot add a duration with minutes when the time minutes unknow."); } newTime.minute += normalisedDuration.Minutes; NormaliseMinute(newTime); } if (normalisedDuration.Hours > 0) { newTime.hour += normalisedDuration.Hours; if (newTime.hour >= 24) { throw new ApplicationException("Invalid durtion results in the hours value greater or equal to 24."); } } return(newTime); }
private static void NormaliseSubtractedMinute(Iso8601Time isoTime) { Time time = new Time(isoTime.hour, isoTime.minute); time.NormaliseSubtractedMinutes(); isoTime.hour = time.Hour; isoTime.minute = time.Minute; }
private static void NormaliseSubtractedSecond(Iso8601Time isoTime) { Time time = new Time(isoTime.hour, isoTime.minute, isoTime.second); time.NormaliseSubtractedSecond(); isoTime.hour = time.Hour; isoTime.minute = time.Minute; isoTime.second = time.Second; }
private static void NormaliseMinute(Iso8601Time isoTime) { DesignByContract.Check.Require(!isoTime.MinuteUnknown, "isoTime.MinuteUnknow must be false."); Time time = new Time(isoTime.hour, isoTime.minute); time.NormaliseMinute(); isoTime.hour = time.Hour; isoTime.minute = time.Minute; }
private static void NormaliseFractionalSecond(Iso8601Time isoTime) { DesignByContract.Check.Require(!isoTime.MinuteUnknown, "isoTime.MinuteUnknow must be false."); DesignByContract.Check.Require(!isoTime.SecondUnknown, "isoTime.SecondUnknown must be false."); DesignByContract.Check.Require(isoTime.HasFractionalSecond, "isoTime.HasFractionalSecond must be true."); Time time = new Time(isoTime.hour, isoTime.minute, isoTime.second, isoTime.fractionalSecond); time.NormaliseFractionalSecond(); isoTime.hour = time.Hour; isoTime.minute = time.Minute; isoTime.second = time.Second; isoTime.fractionalSecond = time.FractionalSeconds; }
/// <summary> /// Compare the current time instance with the obj. Returns 0 if they are equal, /// -1 if the current instance less than obj, 1 if the current instance greater than obj. /// </summary> /// <param name="obj"></param> /// <returns></returns> public int CompareTo(object obj) { // precondition is that the current instance must be the same type as obj Check.Require(this.GetType() == obj.GetType(), "The current instance (" + this.GetType().ToString() + ") must be the same type as the obj(" + obj.GetType().ToString() + ")"); Iso8601Time objTime = obj as Iso8601Time; if (this.GetTimeSeconds() > objTime.GetTimeSeconds()) { return(1); } else if (this.GetTimeSeconds() < objTime.GetTimeSeconds()) { return(-1); } else { return(0); } }
internal Iso8601Time Subtract(Iso8601Duration duration) { DesignByContract.Check.Require(duration != null, "duration must not be null."); Iso8601Time newTime = new Iso8601Time(this.ToString()); Iso8601Duration normalisedDuration = Iso8601Duration.Normalise(duration); if (normalisedDuration.FractionalSecond > 0) { if (newTime.SecondUnknown) { throw new NotSupportedException("Cannot subtract a duration with fractionalSeconds when the time seconds unknow."); } if (newTime.HasFractionalSecond) { newTime.fractionalSecond -= normalisedDuration.FractionalSecond; } else { newTime.fractionalSecond = (normalisedDuration.FractionalSecond) * -1; } NormaliseSubtractedFractionalSecond(newTime); } if (normalisedDuration.Seconds > 0) { if (newTime.SecondUnknown) { throw new NotSupportedException("Cannot subtract a duration with seconds when the time seconds unknow."); } newTime.second -= normalisedDuration.Seconds; NormaliseSubtractedSecond(newTime); } if (normalisedDuration.Minutes > 0) { if (newTime.MinuteUnknown) { throw new NotSupportedException("Cannot subtract a duration with minutes when the time minutes unknow."); } newTime.minute -= normalisedDuration.Minutes; NormaliseSubtractedMinute(newTime); } if (normalisedDuration.Hours > 0) { newTime.hour -= normalisedDuration.Hours; if (newTime.hour < 0) { throw new ApplicationException("Invalid duration results the Iso8601Time hour less than 0 after subtraction."); } } return(newTime); }
private static void NormaliseSecond(Iso8601Time isoTime) { DesignByContract.Check.Require(!isoTime.MinuteUnknown, "isoTime.MinuteUnknow must be false."); DesignByContract.Check.Require(!isoTime.SecondUnknown, "isoTime.SecondUnknown must be false."); Time time = new Time(isoTime.hour, isoTime.minute, isoTime.second); time.NormaliseSecond(); isoTime.hour = time.Hour; isoTime.minute = time.Minute; isoTime.second = time.Second; }
internal Iso8601Time Subtract(Iso8601Duration duration) { DesignByContract.Check.Require(duration != null, "duration must not be null."); Iso8601Time newTime = new Iso8601Time(this.ToString()); Iso8601Duration normalisedDuration = Iso8601Duration.Normalise(duration); if (normalisedDuration.FractionalSecond > 0) { if (newTime.SecondUnknown) throw new NotSupportedException("Cannot subtract a duration with fractionalSeconds when the time seconds unknow."); if (newTime.HasFractionalSecond) newTime.fractionalSecond -= normalisedDuration.FractionalSecond; else newTime.fractionalSecond = (normalisedDuration.FractionalSecond)*-1; NormaliseSubtractedFractionalSecond(newTime); } if (normalisedDuration.Seconds > 0) { if (newTime.SecondUnknown) throw new NotSupportedException("Cannot subtract a duration with seconds when the time seconds unknow."); newTime.second -= normalisedDuration.Seconds; NormaliseSubtractedSecond(newTime); } if (normalisedDuration.Minutes > 0) { if (newTime.MinuteUnknown) throw new NotSupportedException("Cannot subtract a duration with minutes when the time minutes unknow."); newTime.minute -= normalisedDuration.Minutes; NormaliseSubtractedMinute(newTime); } if (normalisedDuration.Hours > 0) { newTime.hour -= normalisedDuration.Hours; if (newTime.hour < 0) throw new ApplicationException("Invalid duration results the Iso8601Time hour less than 0 after subtraction."); } return newTime; }
internal Iso8601Time Add(Iso8601Duration duration) { DesignByContract.Check.Require(duration != null, "duration must not be null."); Iso8601Time newTime = new Iso8601Time(this.ToString()); Iso8601Duration normalisedDuration = Iso8601Duration.Normalise(duration); if (normalisedDuration.FractionalSecond > 0) { if (newTime.SecondUnknown) throw new NotSupportedException("Cannot add a duration with fractionalSeconds when the datetime seconds unknow."); if (newTime.HasFractionalSecond) { newTime.fractionalSecond += normalisedDuration.FractionalSecond; NormaliseFractionalSecond(newTime); } else newTime.fractionalSecond = normalisedDuration.FractionalSecond; } if (normalisedDuration.Seconds > 0) { if (newTime.SecondUnknown) throw new NotSupportedException("Cannot add a duration with seconds when the time seconds unknow."); newTime.second += normalisedDuration.Seconds; NormaliseSecond(newTime); } if (normalisedDuration.Minutes > 0) { if (newTime.MinuteUnknown) throw new NotSupportedException("Cannot add a duration with minutes when the time minutes unknow."); newTime.minute += normalisedDuration.Minutes; NormaliseMinute(newTime); } if (normalisedDuration.Hours > 0) { newTime.hour += normalisedDuration.Hours; if (newTime.hour >= 24) throw new ApplicationException("Invalid durtion results in the hours value greater or equal to 24."); } return newTime; }
private bool IsMatchPattern(Iso8601Time isoTime) { DesignByContract.Check.Require(isoTime != null, string.Format(CommonStrings.XMustNotBeNull, "isoTime")); DesignByContract.Check.Require(this.Pattern != null, string.Format(CommonStrings.XMustNotBeNull, "Pattern")); if(!CDateTime.IsMatchValidityKind(this.MinuteValidity, isoTime.MinuteUnknown)) return false; if(!CDateTime.IsMatchValidityKind(this.SecondValidity, isoTime.SecondUnknown)) return false; return true; }
internal override string ValidValue(object aValue) { DesignByContract.Check.Require(aValue != null, string.Format(CommonStrings.XMustNotBeNull, "aValue")); string timeString = aValue.ToString(); if (!Iso8601Time.ValidIso8601Time(timeString)) { return string.Format(AmValidationStrings.InvalidIsoTime, timeString); } Iso8601Time isoTime = new Iso8601Time(timeString); if (isoTime == null) throw new ApplicationException(string.Format(CommonStrings.XIsNull, "isoTime")); if (this.Pattern != null) { if (!IsMatchPattern(isoTime)) { return string.Format(AmValidationStrings.TimeXDoesNotMatchPatternY, isoTime, Pattern); } } if (this.Range != null) if (!this.Range.Has(isoTime)) { return string.Format(AmValidationStrings.TimeXOutOfRange, isoTime); } return string.Empty; }