The Labs \ Source Viewer \ SSCLI \ System.ComponentModel \ DateTimeConverter

  1. //------------------------------------------------------------------------------
  2. // <copyright file="DateTimeConverter.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. /*
  16. */
  17. namespace System.ComponentModel
  18. {
  19.    
  20.     using Microsoft.Win32;
  21.     using System.ComponentModel.Design.Serialization;
  22.     using System.Diagnostics;
  23.     using System.Globalization;
  24.     using System.Reflection;
  25.     using System.Runtime.InteropServices;
  26.     using System.Runtime.Remoting;
  27.     using System.Runtime.Serialization.Formatters;
  28.     using System.Security.Permissions;
  29.    
  30.     /// <devdoc>
  31.     /// <para>Provides a type converter to convert <see cref='System.DateTime'/>
  32.     /// objects to and from various other representations.</para>
  33.     /// </devdoc>
  34.     [HostProtection(SharedState = true)]
  35.     public class DateTimeConverter : TypeConverter
  36.     {
  37.        
  38.         /// <devdoc>
  39.         /// <para>Gets a value indicating whether this converter can
  40.         /// convert an object in the given source type to a <see cref='System.DateTime'/>
  41.         /// object using the
  42.         /// specified context.</para>
  43.         /// </devdoc>
  44.         public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
  45.         {
  46.             if (sourceType == typeof(string)) {
  47.                 return true;
  48.             }
  49.             return base.CanConvertFrom(context, sourceType);
  50.         }
  51.        
  52.         /// <devdoc>
  53.         /// <para>Gets a value indicating whether this converter can
  54.         /// convert an object to the given destination type using the context.</para>
  55.         /// </devdoc>
  56.         public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
  57.         {
  58.             if (destinationType == typeof(InstanceDescriptor)) {
  59.                 return true;
  60.             }
  61.             return base.CanConvertTo(context, destinationType);
  62.         }
  63.        
  64.         /// <devdoc>
  65.         /// <para>Converts the given value object to a <see cref='System.DateTime'/>
  66.         /// object.</para>
  67.         /// </devdoc>
  68.         public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
  69.         {
  70.             if (value is string) {
  71.                 string text = ((string)value).Trim();
  72.                 if (text.Length == 0) {
  73.                     return DateTime.MinValue;
  74.                 }
  75.                 try {
  76.                     // See if we have a culture info to parse with. If so, then use it.
  77.                     //
  78.                     DateTimeFormatInfo formatInfo = null;
  79.                    
  80.                     if (culture != null) {
  81.                         formatInfo = (DateTimeFormatInfo)culture.GetFormat(typeof(DateTimeFormatInfo));
  82.                     }
  83.                    
  84.                     if (formatInfo != null) {
  85.                         return DateTime.Parse(text, formatInfo);
  86.                     }
  87.                     else {
  88.                         return DateTime.Parse(text, culture);
  89.                     }
  90.                 }
  91.                 catch (FormatException e) {
  92.                     throw new FormatException(SR.GetString(SR.ConvertInvalidPrimitive, (string)value, "DateTime"), e);
  93.                 }
  94.             }
  95.            
  96.             return base.ConvertFrom(context, culture, value);
  97.         }
  98.        
  99.         /// <devdoc>
  100.         /// <para>Converts the given value object to a <see cref='System.DateTime'/>
  101.         /// object
  102.         /// using the arguments.</para>
  103.         /// </devdoc>
  104.         public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
  105.         {
  106.             if (destinationType == typeof(string) && value is DateTime) {
  107.                 DateTime dt = (DateTime)value;
  108.                 if (dt == DateTime.MinValue) {
  109.                     return string.Empty;
  110.                 }
  111.                
  112.                 if (culture == null) {
  113.                     culture = CultureInfo.CurrentCulture;
  114.                 }
  115.                
  116.                 DateTimeFormatInfo formatInfo = null;
  117.                 formatInfo = (DateTimeFormatInfo)culture.GetFormat(typeof(DateTimeFormatInfo));
  118.                
  119.                 string format;
  120.                 if (culture == CultureInfo.InvariantCulture) {
  121.                     if (dt.TimeOfDay.TotalSeconds == 0) {
  122.                         return dt.ToString("yyyy-MM-dd", culture);
  123.                     }
  124.                     else {
  125.                         return dt.ToString(culture);
  126.                     }
  127.                 }
  128.                 if (dt.TimeOfDay.TotalSeconds == 0) {
  129.                     format = formatInfo.ShortDatePattern;
  130.                 }
  131.                 else {
  132.                     format = formatInfo.ShortDatePattern + " " + formatInfo.ShortTimePattern;
  133.                 }
  134.                
  135.                 return dt.ToString(format, CultureInfo.CurrentCulture);
  136.             }
  137.             if (destinationType == typeof(InstanceDescriptor) && value is DateTime) {
  138.                 DateTime dt = (DateTime)value;
  139.                
  140.                 if (dt.Ticks == 0) {
  141.                     // Make a special case for the empty DateTime
  142.                     //
  143.                     ConstructorInfo ctr = typeof(DateTime).GetConstructor(new Type[] {typeof(Int64)});
  144.                    
  145.                     if (ctr != null) {
  146.                         return new InstanceDescriptor(ctr, new object[] {dt.Ticks});
  147.                     }
  148.                 }
  149.                
  150.                 ConstructorInfo ctor = typeof(DateTime).GetConstructor(new Type[] {typeof(int), typeof(int), typeof(int), typeof(int), typeof(int), typeof(int), typeof(int)});
  151.                
  152.                 if (ctor != null) {
  153.                     return new InstanceDescriptor(ctor, new object[] {dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond});
  154.                 }
  155.             }
  156.            
  157.             return base.ConvertTo(context, culture, value, destinationType);
  158.         }
  159.     }
  160. }

Developer Fusion