using System; namespace com.andoutomo.kybernetes.data { public class TimeComponent { private int hour; private int minute; #region getter/setter public int Hour { get { return hour; } } public int Minute { get { return minute; } } public int TotalMinute { get { return hour * 60 + minute; } } public decimal TotalHour { get { return hour + (minute / 60); } } #endregion #region Constructor & defaultMethod private TimeComponent(){} public TimeComponent(int _hour, int _minute) { minuteToTime(_hour * 60 + _minute); if (this.hour != -1 && this.minute != -1) { IsValid = true; } } public TimeComponent(int _totalMinute) { minuteToTime(_totalMinute); if (this.hour != -1 && this.minute != -1) { IsValid = true; } } public bool IsValid { get; private set; } public TimeComponent(string _timeStr) { if (_timeStr == null || _timeStr.Equals(string.Empty)) { IsValid = false; this.hour = -1; this.minute = -1; return; } IsValid = true; string[] data = _timeStr.Split(':'); if (data.Length >= 2) { this.minuteToTime(int.Parse(data[0]) * 60 + int.Parse(data[1])); } else { this.minuteToTime(int.Parse(data[0])); } } public override int GetHashCode() { return base.GetHashCode(); } public override string ToString() { if (IsValid) { return hour.ToString("00") + ":" + minute.ToString("00"); } return string.Empty; } public override bool Equals(object obj) { if (!(obj is TimeComponent)) { return false; } if (base.Equals(obj)) { return true; } return this.TotalMinute == ((TimeComponent)obj).TotalMinute; } #endregion #region Calculate #region add public TimeComponent add(int minute) { minuteToTime(minute + this.TotalMinute); return this; } public TimeComponent add(int hour, int minute) { return add(hour * 60 + minute); } public TimeComponent add(TimeComponent time) { return add(time.TotalMinute); } #endregion #region subtract public TimeComponent subtract(int _minute) { minuteToTime(this.TotalMinute - _minute); return this; } public TimeComponent subtract(int _hour, int _minute) { return subtract(hour * 60 + minute); } public TimeComponent subtract(TimeComponent time) { return subtract(time.TotalMinute); } #endregion private void minuteToTime(int minute) { decimal decData = minute; if (decData <= 0) { IsValid = false; this.hour = -1; this.minute = -1; } this.hour = decimal.ToInt32(decimal.Divide(decData, 60)); this.minute = decimal.ToInt32(decimal.Remainder(decData, 60)); } #endregion /// /// fromのコンポーネントとの差分を算出して返却します。 /// /// /// public int getSubtractionMinute(TimeComponent from) { if (this.TotalMinute >= from.TotalMinute) { return decimal.ToInt32(Math.Abs(this.TotalMinute - from.TotalMinute)); } else { int dayOver = this.TotalMinute + (24 * 60); return decimal.ToInt32(Math.Abs(dayOver - from.TotalMinute)); } } public TimeComponent getSubtractionComponent(TimeComponent from) { return new TimeComponent(this.getSubtractionMinute(from)); } public static TimeComponent justNow() { return new TimeComponent(DateTime.Now.Hour, DateTime.Now.Minute); } } }