2010-01-04 Jb Evain <jbevain@novell.com>
[mcs.git] / class / System.Core / System / TimeZoneInfo.TransitionTime.cs
blob59e608c700f7a78e79d97e7589f7a70d480b68e9
1 /*
2 * System.TimeZoneInfo.TransitionTime
4 * Author(s)
5 * Stephane Delcroix <stephane@delcroix.org>
7 * Permission is hereby granted, free of charge, to any person obtaining
8 * a copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sublicense, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 #if (INSIDE_CORLIB && (NET_4_0 || BOOTSTRAP_NET_4_0)) || (NET_2_1 && !INSIDE_CORLIB) || (NET_3_5 && !NET_4_0 && !BOOTSTRAP_NET_4_0)
29 using System.Runtime.Serialization;
31 namespace System
33 public sealed partial class TimeZoneInfo
35 [SerializableAttribute]
36 public struct TransitionTime : IEquatable<TimeZoneInfo.TransitionTime>, ISerializable, IDeserializationCallback
38 DateTime timeOfDay;
39 public DateTime TimeOfDay {
40 get { return timeOfDay; }
43 int month;
44 public int Month {
45 get { return month; }
48 int day;
49 public int Day {
50 get {
51 #if STRICT
52 if (!isFixedDateRule)
53 throw new Exception ("Day property is not valid for floating date rules");
54 #endif
55 return day;
59 int week;
60 public int Week {
61 get {
62 #if STRICT
63 if (isFixedDateRule)
64 throw new Exception ("Week property is not valid for fixed date rules");
65 #endif
67 return week;
71 DayOfWeek dayOfWeek;
72 public DayOfWeek DayOfWeek {
73 get {
74 #if STRICT
75 if (isFixedDateRule)
76 throw new Exception ("DayOfWeek property is not valid for fixed date rules");
77 #endif
79 return dayOfWeek;
83 bool isFixedDateRule;
84 public bool IsFixedDateRule {
85 get { return isFixedDateRule; }
88 public static TransitionTime CreateFixedDateRule (
89 DateTime timeOfDay,
90 int month,
91 int day)
93 return new TransitionTime (timeOfDay, month, day);
96 public static TransitionTime CreateFloatingDateRule (
97 DateTime timeOfDay,
98 int month,
99 int week,
100 DayOfWeek dayOfWeek)
102 return new TransitionTime (timeOfDay, month, week, dayOfWeek);
105 private TransitionTime (
106 DateTime timeOfDay,
107 int month,
108 int day) : this (timeOfDay, month)
110 if (day < 1 || day > 31)
111 throw new ArgumentOutOfRangeException ("day parameter is less than 1 or greater than 31");
113 this.day = day;
114 this.isFixedDateRule = true;
117 private TransitionTime (
118 DateTime timeOfDay,
119 int month,
120 int week,
121 DayOfWeek dayOfWeek) : this (timeOfDay, month)
123 if (week < 1 || week > 5)
124 throw new ArgumentOutOfRangeException ("week parameter is less than 1 or greater than 5");
126 if (dayOfWeek != DayOfWeek.Sunday &&
127 dayOfWeek != DayOfWeek.Monday &&
128 dayOfWeek != DayOfWeek.Tuesday &&
129 dayOfWeek != DayOfWeek.Wednesday &&
130 dayOfWeek != DayOfWeek.Thursday &&
131 dayOfWeek != DayOfWeek.Friday &&
132 dayOfWeek != DayOfWeek.Saturday)
133 throw new ArgumentOutOfRangeException ("dayOfWeek parameter is not a member od DayOfWeek enumeration");
135 this.week = week;
136 this.dayOfWeek = dayOfWeek;
137 this.isFixedDateRule = false;
140 private TransitionTime (
141 DateTime timeOfDay,
142 int month)
144 if (timeOfDay.Year != 1 || timeOfDay.Month != 1 || timeOfDay.Day != 1)
145 throw new ArgumentException ("timeOfDay parameter has a non-default date component");
147 if (timeOfDay.Kind != DateTimeKind.Unspecified)
148 throw new ArgumentException ("timeOfDay parameter Kind's property is not DateTimeKind.Unspecified");
150 if (timeOfDay.Ticks % TimeSpan.TicksPerMillisecond != 0)
151 throw new ArgumentException ("timeOfDay parameter does not represent a whole number of milliseconds");
153 if (month < 1 || month > 12)
154 throw new ArgumentOutOfRangeException ("month parameter is less than 1 or greater than 12");
156 this.timeOfDay = timeOfDay;
157 this.month = month;
159 this.week = -1;
160 this.dayOfWeek = (System.DayOfWeek)(-1);
161 this.day = -1;
162 this.isFixedDateRule = false;
165 public static bool operator == (TransitionTime t1, TransitionTime t2)
167 return ( t1.day == t2.day &&
168 t1.dayOfWeek == t2.dayOfWeek &&
169 t1.isFixedDateRule == t2.isFixedDateRule &&
170 t1.month == t2.month &&
171 t1.timeOfDay == t2.timeOfDay &&
172 t1.week == t2.week);
175 public static bool operator != (TransitionTime t1, TransitionTime t2)
177 return !(t1 == t2);
180 public void GetObjectData (SerializationInfo info, StreamingContext context)
182 throw new NotImplementedException ();
185 public override bool Equals (object other)
187 if (other is TransitionTime)
188 return this == (TransitionTime) other;
189 return false;
192 public bool Equals (TimeZoneInfo.TransitionTime other)
194 return this == other;
197 public override int GetHashCode ()
199 return (day ^ (int)dayOfWeek ^ month ^ (int)timeOfDay.Ticks ^ week);
202 public void OnDeserialization (object sender)
204 throw new NotImplementedException ();
210 #endif