2010-06-21 Atsushi Enomoto <atsushi@ximian.com>
[mcs.git] / class / System.Core / System / TimeZoneInfo.TransitionTime.cs
blob72eca19ad2cbcba2bf4479ae139e76f8a7c5c3fe
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 || MOONLIGHT)) || (MONOTOUCH && !INSIDE_CORLIB) || (NET_3_5 && !NET_4_0 && !BOOTSTRAP_NET_4_0)
29 using System.Runtime.CompilerServices;
30 using System.Runtime.Serialization;
32 namespace System
34 public sealed partial class TimeZoneInfo
36 [SerializableAttribute]
37 #if NET_4_0 || BOOTSTRAP_NET_4_0
38 [TypeForwardedFrom (Consts.AssemblySystemCore_3_5)]
39 #elif MOONLIGHT
40 [TypeForwardedFrom (Consts.AssemblySystem_Core)]
41 #endif
42 public struct TransitionTime : IEquatable<TimeZoneInfo.TransitionTime>, ISerializable, IDeserializationCallback
44 DateTime timeOfDay;
45 public DateTime TimeOfDay {
46 get { return timeOfDay; }
49 int month;
50 public int Month {
51 get { return month; }
54 int day;
55 public int Day {
56 get {
57 #if STRICT
58 if (!isFixedDateRule)
59 throw new Exception ("Day property is not valid for floating date rules");
60 #endif
61 return day;
65 int week;
66 public int Week {
67 get {
68 #if STRICT
69 if (isFixedDateRule)
70 throw new Exception ("Week property is not valid for fixed date rules");
71 #endif
73 return week;
77 DayOfWeek dayOfWeek;
78 public DayOfWeek DayOfWeek {
79 get {
80 #if STRICT
81 if (isFixedDateRule)
82 throw new Exception ("DayOfWeek property is not valid for fixed date rules");
83 #endif
85 return dayOfWeek;
89 bool isFixedDateRule;
90 public bool IsFixedDateRule {
91 get { return isFixedDateRule; }
94 public static TransitionTime CreateFixedDateRule (
95 DateTime timeOfDay,
96 int month,
97 int day)
99 return new TransitionTime (timeOfDay, month, day);
102 public static TransitionTime CreateFloatingDateRule (
103 DateTime timeOfDay,
104 int month,
105 int week,
106 DayOfWeek dayOfWeek)
108 return new TransitionTime (timeOfDay, month, week, dayOfWeek);
111 private TransitionTime (
112 DateTime timeOfDay,
113 int month,
114 int day) : this (timeOfDay, month)
116 if (day < 1 || day > 31)
117 throw new ArgumentOutOfRangeException ("day parameter is less than 1 or greater than 31");
119 this.day = day;
120 this.isFixedDateRule = true;
123 private TransitionTime (
124 DateTime timeOfDay,
125 int month,
126 int week,
127 DayOfWeek dayOfWeek) : this (timeOfDay, month)
129 if (week < 1 || week > 5)
130 throw new ArgumentOutOfRangeException ("week parameter is less than 1 or greater than 5");
132 if (dayOfWeek != DayOfWeek.Sunday &&
133 dayOfWeek != DayOfWeek.Monday &&
134 dayOfWeek != DayOfWeek.Tuesday &&
135 dayOfWeek != DayOfWeek.Wednesday &&
136 dayOfWeek != DayOfWeek.Thursday &&
137 dayOfWeek != DayOfWeek.Friday &&
138 dayOfWeek != DayOfWeek.Saturday)
139 throw new ArgumentOutOfRangeException ("dayOfWeek parameter is not a member od DayOfWeek enumeration");
141 this.week = week;
142 this.dayOfWeek = dayOfWeek;
143 this.isFixedDateRule = false;
146 private TransitionTime (
147 DateTime timeOfDay,
148 int month)
150 if (timeOfDay.Year != 1 || timeOfDay.Month != 1 || timeOfDay.Day != 1)
151 throw new ArgumentException ("timeOfDay parameter has a non-default date component");
153 if (timeOfDay.Kind != DateTimeKind.Unspecified)
154 throw new ArgumentException ("timeOfDay parameter Kind's property is not DateTimeKind.Unspecified");
156 if (timeOfDay.Ticks % TimeSpan.TicksPerMillisecond != 0)
157 throw new ArgumentException ("timeOfDay parameter does not represent a whole number of milliseconds");
159 if (month < 1 || month > 12)
160 throw new ArgumentOutOfRangeException ("month parameter is less than 1 or greater than 12");
162 this.timeOfDay = timeOfDay;
163 this.month = month;
165 this.week = -1;
166 this.dayOfWeek = (System.DayOfWeek)(-1);
167 this.day = -1;
168 this.isFixedDateRule = false;
171 public static bool operator == (TransitionTime t1, TransitionTime t2)
173 return ( t1.day == t2.day &&
174 t1.dayOfWeek == t2.dayOfWeek &&
175 t1.isFixedDateRule == t2.isFixedDateRule &&
176 t1.month == t2.month &&
177 t1.timeOfDay == t2.timeOfDay &&
178 t1.week == t2.week);
181 public static bool operator != (TransitionTime t1, TransitionTime t2)
183 return !(t1 == t2);
187 #if NET_4_0
188 void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context)
189 #else
190 public void GetObjectData (SerializationInfo info, StreamingContext context)
191 #endif
193 throw new NotImplementedException ();
196 public override bool Equals (object other)
198 if (other is TransitionTime)
199 return this == (TransitionTime) other;
200 return false;
203 public bool Equals (TimeZoneInfo.TransitionTime other)
205 return this == other;
208 public override int GetHashCode ()
210 return (day ^ (int)dayOfWeek ^ month ^ (int)timeOfDay.Ticks ^ week);
213 #if NET_4_0
214 void IDeserializationCallback.OnDeserialization (object sender)
215 #else
216 public void OnDeserialization (object sender)
217 #endif
219 throw new NotImplementedException ();
225 #endif