2 // System.Globalization.DateTimeFormatInfo
4 // Some useful functions are missing in the ECMA specs.
5 // They have been added following MS SDK Beta2
7 // Martin Weindel (martin.weindel@t-online.de)
9 // (C) Martin Weindel (martin.weindel@t-online.de)
12 using System.Threading;
14 namespace System.Globalization
\r
17 public sealed class DateTimeFormatInfo : ICloneable, IFormatProvider {
18 private static readonly string MSG_READONLY = "This instance is read only";
\r
19 private static readonly string MSG_ARRAYSIZE_MONTH = "An array with exactly 13 elements is needed";
\r
20 private static readonly string MSG_ARRAYSIZE_DAY = "An array with exactly 7 elements is needed";
\r
21 private static readonly string[] INVARIANT_ABBREVIATED_DAY_NAMES
\r
22 = new string[7] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
\r
23 private static readonly string[] INVARIANT_DAY_NAMES
\r
24 = new string[7] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
\r
25 private static readonly string[] INVARIANT_ABBREVIATED_MONTH_NAMES
\r
26 = new string[13] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""};
\r
27 private static readonly string[] INVARIANT_MONTH_NAMES
\r
28 = new string[13] { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ""};
\r
30 public static DateTimeFormatInfo theInvariantDateTimeFormatInfo;
32 private bool readOnly;
33 private string _AMDesignator;
34 private string _PMDesignator;
35 private string _DateSeparator;
36 private string _TimeSeparator;
37 private string _ShortDatePattern;
38 private string _LongDatePattern;
39 private string _ShortTimePattern;
40 private string _LongTimePattern;
41 private string _MonthDayPattern;
42 private string _YearMonthPattern;
43 private string _FullDateTimePattern;
44 private string _RFC1123Pattern;
45 private string _SortableDateTimePattern;
46 private string _UniversalSortableDateTimePattern;
47 private DayOfWeek _FirstDayOfWeek;
48 private Calendar _Calendar;
49 private CalendarWeekRule _CalendarWeekRule;
50 private string[] _AbbreviatedDayNames;
51 private string[] _DayNames;
52 private string[] _MonthNames;
53 private string[] _AbbreviatedMonthNames;
55 public DateTimeFormatInfo()
62 _ShortDatePattern = "MM/dd/yyyy";
63 _LongDatePattern = "dddd, dd MMMM yyyy";
64 _ShortTimePattern = "HH:mm";
65 _LongTimePattern = "HH:mm:ss";
66 _MonthDayPattern = "MMMM dd";
67 _YearMonthPattern = "yyyy MMMM";
68 _FullDateTimePattern = "dddd, dd MMMM yyyy HH:mm:ss";
70 // FIXME for the following three pattern: "The default value of this property is derived from the calendar that is set for CultureInfo.CurrentCulture or the default calendar of CultureInfo.CurrentCulture."
71 _RFC1123Pattern = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
72 _SortableDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss";
73 _UniversalSortableDateTimePattern = "yyyy'-'MM'-'dd HH':'mm':'ss'Z'";
75 _FirstDayOfWeek = DayOfWeek.Sunday;
76 _Calendar = new GregorianCalendar();
77 _CalendarWeekRule = CalendarWeekRule.FirstDay;
79 _AbbreviatedDayNames = INVARIANT_ABBREVIATED_DAY_NAMES;
80 _DayNames = INVARIANT_DAY_NAMES;
81 _AbbreviatedMonthNames = INVARIANT_ABBREVIATED_MONTH_NAMES;
82 _MonthNames = INVARIANT_MONTH_NAMES;
85 // LAMESPEC: this is not in ECMA specs
86 public static DateTimeFormatInfo GetInstance(IFormatProvider provider)
88 if (provider != null) {
89 DateTimeFormatInfo dtfi;
90 dtfi = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
98 public bool IsReadOnly {
104 public static DateTimeFormatInfo ReadOnly(DateTimeFormatInfo dtfi)
106 DateTimeFormatInfo copy = (DateTimeFormatInfo)dtfi.Clone();
107 copy.readOnly = true;
111 public object Clone ()
113 DateTimeFormatInfo clone = (DateTimeFormatInfo) MemberwiseClone();
114 // clone is not read only
115 clone.readOnly = false;
119 public object GetFormat(Type formatType)
\r
121 return (formatType == GetType()) ? this : null;
\r
124 public string GetAbbreviatedEraName(int era)
\r
126 if (era < _Calendar.Eras.Length || era >= _Calendar.Eras.Length)
\r
127 throw new ArgumentOutOfRangeException();
\r
129 //FIXME: implement me
\r
133 public string GetAbbreviatedMonthName(int month)
\r
135 if (month < 1 || month > 13) throw new ArgumentOutOfRangeException();
\r
136 return _AbbreviatedMonthNames[month-1];
\r
139 public int GetEra(string eraName)
\r
141 if (eraName == null) throw new ArgumentNullException();
\r
142 eraName = eraName.ToUpper();
\r
144 //FIXME: implement me
\r
148 public string GetEraName(int era)
\r
150 if (era < _Calendar.Eras.Length || era >= _Calendar.Eras.Length)
\r
151 throw new ArgumentOutOfRangeException();
\r
153 //FIXME: implement me
\r
157 public string GetMonthName(int month)
\r
159 if (month < 1 || month > 13) throw new ArgumentOutOfRangeException();
\r
160 return _MonthNames[month-1];
\r
163 public string[] AbbreviatedDayNames
\r
167 return (string[]) _AbbreviatedDayNames.Clone();
\r
172 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
173 if (value == null) throw new ArgumentNullException();
\r
174 if (value.GetLength(0) != 7) throw new ArgumentException(MSG_ARRAYSIZE_DAY);
\r
175 _AbbreviatedDayNames = (string[]) value.Clone();
\r
179 public string[] AbbreviatedMonthNames
\r
183 return (string[]) _AbbreviatedMonthNames.Clone();
\r
188 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
189 if (value == null) throw new ArgumentNullException();
\r
190 if (value.GetLength(0) != 13) throw new ArgumentException(MSG_ARRAYSIZE_MONTH);
\r
191 _AbbreviatedMonthNames = (string[]) value.Clone();
\r
195 public string[] DayNames
\r
199 return (string[]) _DayNames.Clone();
\r
204 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
205 if (value == null) throw new ArgumentNullException();
\r
206 if (value.GetLength(0) != 7) throw new ArgumentException(MSG_ARRAYSIZE_DAY);
\r
207 _DayNames = (string[]) value.Clone();
\r
211 public string[] MonthNames
\r
215 return (string[]) _MonthNames.Clone();
\r
220 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
221 if (value == null) throw new ArgumentNullException();
\r
222 if (value.GetLength(0) != 13) throw new ArgumentException(MSG_ARRAYSIZE_MONTH);
\r
223 _MonthNames = (string[]) value.Clone();
\r
227 public string AMDesignator
\r
231 return _AMDesignator;
\r
236 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
237 if (value == null) throw new ArgumentNullException();
\r
238 _AMDesignator = value;
\r
242 public string PMDesignator
\r
246 return _PMDesignator;
\r
251 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
252 if (value == null) throw new ArgumentNullException();
\r
253 _PMDesignator = value;
\r
257 public string DateSeparator
\r
261 return _DateSeparator;
\r
266 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
267 if (value == null) throw new ArgumentNullException();
\r
268 _DateSeparator = value;
\r
272 public string TimeSeparator
\r
276 return _TimeSeparator;
\r
281 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
282 if (value == null) throw new ArgumentNullException();
\r
283 _TimeSeparator = value;
\r
287 public string LongDatePattern
\r
291 return _LongDatePattern;
\r
296 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
297 if (value == null) throw new ArgumentNullException();
\r
298 _LongDatePattern = value;
\r
302 public string ShortDatePattern
\r
306 return _ShortDatePattern;
\r
311 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
312 if (value == null) throw new ArgumentNullException();
\r
313 _ShortDatePattern = value;
\r
317 public string ShortTimePattern
\r
321 return _ShortTimePattern;
\r
326 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
327 if (value == null) throw new ArgumentNullException();
\r
328 _ShortTimePattern = value;
\r
332 public string LongTimePattern
\r
336 return _LongTimePattern;
\r
341 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
342 if (value == null) throw new ArgumentNullException();
\r
343 _LongTimePattern = value;
\r
347 public string MonthDayPattern
\r
351 return _MonthDayPattern;
\r
356 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
357 if (value == null) throw new ArgumentNullException();
\r
358 _MonthDayPattern = value;
\r
362 public string YearMonthPattern
\r
366 return _YearMonthPattern;
\r
371 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
372 if (value == null) throw new ArgumentNullException();
\r
373 _YearMonthPattern = value;
\r
377 public string FullDateTimePattern
\r
381 return _FullDateTimePattern;
\r
386 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
387 if (value == null) throw new ArgumentNullException();
\r
388 _FullDateTimePattern = value;
\r
392 public static DateTimeFormatInfo CurrentInfo
\r
396 return Thread.CurrentThread.CurrentCulture.DateTimeFormat;
\r
400 public static DateTimeFormatInfo InvariantInfo
\r
404 if (theInvariantDateTimeFormatInfo == null)
\r
406 theInvariantDateTimeFormatInfo =
\r
407 DateTimeFormatInfo.ReadOnly(new DateTimeFormatInfo());
\r
409 return theInvariantDateTimeFormatInfo;
\r
413 // LAMESPEC: this is not in ECMA specs
\r
414 public DayOfWeek FirstDayOfWeek
\r
418 return _FirstDayOfWeek;
\r
422 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
423 if ((int) value < 0 || (int) value > 6) throw new ArgumentOutOfRangeException();
\r
424 _FirstDayOfWeek = value;
\r
428 // LAMESPEC: this is not in ECMA specs
\r
429 public Calendar Calendar
\r
437 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
438 if (value == null) throw new ArgumentNullException();
\r
443 public CalendarWeekRule CalendarWeekRule
\r
447 return _CalendarWeekRule;
\r
451 if (IsReadOnly) throw new InvalidOperationException(MSG_READONLY);
\r
452 _CalendarWeekRule = value;
\r
456 // LAMESPEC: this is not in ECMA specs
\r
457 public string RFC1123Pattern
\r
461 return _RFC1123Pattern;
\r
465 // LAMESPEC: this is not in ECMA specs
\r
466 public string SortableDateTimePattern
\r
470 return _SortableDateTimePattern;
\r
474 // LAMESPEC: this is not in ECMA specs
\r
475 public string UniversalSortableDateTimePattern
\r
479 return _UniversalSortableDateTimePattern;
\r
483 // LAMESPEC: this is not in ECMA specs
\r
484 public string[] GetAllDateTimePatterns()
\r
487 //FIXME: implement me
\r
491 // LAMESPEC: this is not in ECMA specs
\r
492 public string[] GetAllDateTimePatterns(char format)
\r
495 //FIXME: implement me
\r
499 // LAMESPEC: this is not in ECMA specs
\r
500 public string GetDayName(DayOfWeek dayofweek)
\r
502 int index = (int) dayofweek;
\r
503 if (index < 0 || index > 6) throw new ArgumentOutOfRangeException();
\r
504 return _DayNames[index];
\r
507 // LAMESPEC: this is not in ECMA specs
\r
508 public string GetAbbreviatedDayName(DayOfWeek dayofweek)
\r
510 int index = (int) dayofweek;
\r
511 if (index < 0 || index > 6) throw new ArgumentOutOfRangeException();
\r
512 return _AbbreviatedDayNames[index];
\r
515 private static void notImplemented()
\r
517 throw new Exception("Not implemented");
\r