edit: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/time/utc_tags.txt;C1086571
File: utc_tags.txt
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/time/utc_tags.txt;C1086571  (server)    10/28/2009 1:00 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/time/utc_tags.txt;utc
@@ -1,7 +1,5 @@
 fails:Time.utc creates a time based on given values, interpreted as UTC (GMT)
 fails:Time.utc creates a time based on given C-style gmtime arguments, interpreted as UTC (GMT)
-fails:Time.utc handles string-like second argument
-fails:Time.utc handles string arguments
 fails:Time.utc handles float arguments
 fails:Time.utc should accept various year ranges
 fails:Time.utc raises an ArgumentError for out of range values
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/time/fixtures/methods.rb;C1086571
File: methods.rb
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/time/fixtures/methods.rb;C1086571  (server)    10/28/2009 1:09 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/time/fixtures/methods.rb;utc
@@ -1,3 +1,16 @@
+# Workaround for bug 1972 - ENV['TZ'] is read only on startup on Windows
+def can_modify_env_tz?()
+  platform_is_not :windows do
+    return true
+  end
+
+  ruby_bug "1972", "1.9.2" do
+    return true
+  end
+  
+  false
+end
+
 def with_timezone(name, offset = nil, daylight_saving_zone = "")
   zone = name.dup
 
@@ -10,13 +23,18 @@
   end
   zone << daylight_saving_zone
 
-  old = ENV["TZ"]
-  ENV["TZ"] = zone
-
-  begin
-    yield
-  ensure
-    ENV["TZ"] = old
+  if can_modify_env_tz?
+    old = ENV["TZ"]
+    ENV["TZ"] = zone
+  
+    begin
+      yield
+    ensure
+      ENV["TZ"] = old
+    end
+  else
+    # skip the test
+    true.should be_true
   end
 end
 
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/time/shared/time_params.rb;C1086571
File: time_params.rb
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/time/shared/time_params.rb;C1086571  (server)    10/28/2009 1:07 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/rubyspec/core/time/shared/time_params.rb;utc
@@ -1,11 +1,17 @@
-describe :time_params, :shared => true do
+describe :time_params, :shared => true do 
   it "handles string-like second argument" do
-    Time.send(@method, 2008, "12").should  == Time.send(@method, 2008, 12)
-    Time.send(@method, 2008, "dec").should == Time.send(@method, 2008, 12)
-    (obj = mock('12')).should_receive(:to_str).and_return("12")
+    (obj = mock('12')).should_receive(:to_str).and_return("12").should_not_receive(:to_int)
     Time.send(@method, 2008, obj).should == Time.send(@method, 2008, 12)
   end
 
+  it "handles month names for second argument" do
+    month_names = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"]
+    month_names.each_index do |i|
+      Time.send(@method, 2008, month_names[i]       ).should  == Time.send(@method, 2008, i + 1)
+      Time.send(@method, 2008, month_names[i].upcase).should  == Time.send(@method, 2008, i + 1)
+    end
+  end
+
   ruby_bug "#", "1.8.6.114" do
     # Exclude MRI 1.8.6 because it segfaults. :)
     # But the problem is fixed in MRI repository already.
@@ -15,19 +21,39 @@
     end
   end
 
+  it "handles int-like arguments" do
+    (obj = mock('2008')).should_receive(:to_int).and_return(2008)
+    Time.send(@method, obj).should == Time.send(@method, 2008)
+  end
+
   it "handles string arguments" do
-    Time.send(@method, "2000", "1", "1" , "20", "15", "1").should == Time.send(@method, 2000, 1, 1, 20, 15, 1)
-    Time.send(@method, "1", "15", "20", "1", "1", "2000", :ignored, :ignored, :ignored, :ignored).should == Time.send(@method, 1, 15, 20, 1, 1, 2000, :ignored, :ignored, :ignored, :ignored)
+    Time.send(@method, "1999", "1", "1" , "20", "15", "1").should == Time.send(@method, 1999, 1, 1, 20, 15, 1)
   end
+  
+  it "handles string arguments by calling to_i" do
+    [" 1999 ", "1999.1", "abc"].each do |s|
+      Time.send(@method, s).should == Time.send(@method, s.to_i)
+    end
+  end
+  
+  it "does not handle string-like arguments" do
+    (obj = mock('2008')).should_not_receive(:to_str)
+    lambda { Time.send(@method, obj) }.should raise_error(TypeError)
+  end
 
-  it "handles float arguments" do
-    Time.send(@method, 2000.0, 1.0, 1.0, 20.0, 15.0, 1.0).should == Time.send(@method, 2000, 1, 1, 20, 15, 1)
-    Time.send(@method, 1.0, 15.0, 20.0, 1.0, 1.0, 2000.0, :ignored, :ignored, :ignored, :ignored).should == Time.send(@method, 1, 15, 20, 1, 1, 2000, :ignored, :ignored, :ignored, :ignored)
+  it "accepts 10 arguments in the order output by Time#to_a" do
+    Time.send(@method, "1", "15", "20", "1", "1", "1999", :ignored, :ignored, :ignored, :ignored).should == Time.send(@method, 1, 15, 20, 1, 1, 1999, :ignored, :ignored, :ignored, :ignored)
   end
 
   ruby_version_is ""..."1.9.1" do
     it "should accept various year ranges" do
-      Time.send(@method, 1901, 12, 31, 23, 59, 59, 0).wday.should == 2
+      platform_is :windows do
+        lambda { Time.send(@method, 1901, 12, 31, 23, 59, 59, 0) }.should raise_error(ArgumentError) # year
+      end
+      platform_is_not :windows do
+        Time.send(@method, 1901, 12, 31, 23, 59, 59, 0).wday.should == 2
+      end
+
       Time.send(@method, 2037, 12, 31, 23, 59, 59, 0).wday.should == 4
 
       platform_is :wordsize => 32 do
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C1240182
File: Initializers.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C1240182  (server)    10/28/2009 2:18 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;utc
@@ -3003,10 +3003,10 @@
             );
             
             DefineLibraryMethod(module, "puts", 0x52, 
+                new Action<IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.ConversionStorage<System.Collections.IList>, System.Object, System.Object[]>(IronRuby.Builtins.KernelOps.PutString), 
                 new Action<IronRuby.Runtime.BinaryOpStorage, System.Object>(IronRuby.Builtins.KernelOps.PutsEmptyLine), 
                 new Action<IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.ConversionStorage<System.Collections.IList>, System.Object, System.Object>(IronRuby.Builtins.KernelOps.PutString), 
-                new Action<IronRuby.Runtime.BinaryOpStorage, System.Object, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.PutString), 
-                new Action<IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.ConversionStorage<System.Collections.IList>, System.Object, System.Object[]>(IronRuby.Builtins.KernelOps.PutString)
+                new Action<IronRuby.Runtime.BinaryOpStorage, System.Object, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.PutString)
             );
             
             DefineLibraryMethod(module, "raise", 0x52, 
@@ -3305,10 +3305,10 @@
             );
             
             DefineLibraryMethod(module, "puts", 0x61, 
+                new Action<IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.ConversionStorage<System.Collections.IList>, System.Object, System.Object[]>(IronRuby.Builtins.KernelOps.PutString), 
                 new Action<IronRuby.Runtime.BinaryOpStorage, System.Object>(IronRuby.Builtins.KernelOps.PutsEmptyLine), 
                 new Action<IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.ConversionStorage<System.Collections.IList>, System.Object, System.Object>(IronRuby.Builtins.KernelOps.PutString), 
-                new Action<IronRuby.Runtime.BinaryOpStorage, System.Object, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.PutString), 
-                new Action<IronRuby.Runtime.BinaryOpStorage, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.ConversionStorage<System.Collections.IList>, System.Object, System.Object[]>(IronRuby.Builtins.KernelOps.PutString)
+                new Action<IronRuby.Runtime.BinaryOpStorage, System.Object, IronRuby.Builtins.MutableString>(IronRuby.Builtins.KernelOps.PutString)
             );
             
             DefineLibraryMethod(module, "raise", 0x61, 
@@ -4772,9 +4772,9 @@
             );
             
             DefineLibraryMethod(module, "gsub", 0x51, 
+                new Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.RubyScope, IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, System.Object>(IronRuby.Builtins.MutableStringOps.BlockReplaceAll), 
                 new Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.RubyScope, IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.BlockReplaceAll), 
-                new Func<IronRuby.Runtime.RubyScope, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.MutableStringOps.ReplaceAll), 
-                new Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.RubyScope, IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, System.Object>(IronRuby.Builtins.MutableStringOps.BlockReplaceAll)
+                new Func<IronRuby.Runtime.RubyScope, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.MutableStringOps.ReplaceAll)
             );
             
             DefineLibraryMethod(module, "gsub!", 0x51, 
@@ -4934,9 +4934,9 @@
             );
             
             DefineLibraryMethod(module, "sub", 0x51, 
+                new Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.RubyScope, IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, System.Object>(IronRuby.Builtins.MutableStringOps.BlockReplaceFirst), 
                 new Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.RubyScope, IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString, System.Object>(IronRuby.Builtins.MutableStringOps.BlockReplaceFirst), 
-                new Func<IronRuby.Runtime.RubyScope, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.MutableStringOps.ReplaceFirst), 
-                new Func<IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.RubyScope, IronRuby.Runtime.BlockParam, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, System.Object>(IronRuby.Builtins.MutableStringOps.BlockReplaceFirst)
+                new Func<IronRuby.Runtime.RubyScope, IronRuby.Builtins.MutableString, IronRuby.Builtins.RubyRegex, IronRuby.Builtins.MutableString, IronRuby.Builtins.MutableString>(IronRuby.Builtins.MutableStringOps.ReplaceFirst)
             );
             
             DefineLibraryMethod(module, "sub!", 0x51, 
@@ -6299,7 +6299,7 @@
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime), 
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime), 
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime), 
-                new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.RubyContext, System.Object, System.Object[], System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime)
+                new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.RubyContext, System.Object, System.Object[], System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime)
             );
             
             DefineLibraryMethod(module, "local", 0x61, 
@@ -6310,7 +6310,7 @@
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime), 
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime), 
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime), 
-                new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, System.Object, System.Object[], System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime)
+                new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, System.Object, System.Object[], System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime)
             );
             
             DefineLibraryMethod(module, "mktime", 0x61, 
@@ -6321,7 +6321,7 @@
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime), 
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime), 
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime), 
-                new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, System.Object, System.Object[], System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime)
+                new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, System.Object, System.Object[], System.DateTime>(IronRuby.Builtins.TimeOps.CreateLocalTime)
             );
             
             DefineLibraryMethod(module, "now", 0x61, 
@@ -6340,7 +6340,7 @@
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime), 
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime), 
                 new Func<System.Object, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime), 
-                new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.RubyContext, System.Object, System.Object[], System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime)
+                new Func<IronRuby.Runtime.ConversionStorage<System.Int32>, IronRuby.Runtime.ConversionStorage<IronRuby.Builtins.MutableString>, IronRuby.Runtime.RubyContext, System.Object, System.Object[], System.DateTime>(IronRuby.Builtins.TimeOps.CreateGmtTime)
             );
             
         }
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/TimeOps.cs;C1042261
File: TimeOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/TimeOps.cs;C1042261  (server)    10/28/2009 1:03 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/TimeOps.cs;utc
@@ -80,65 +80,139 @@
 
         #region local, mktime
 
+        private static int NormalizeYear(int year) {
+            if (year == 0) {
+                return 2000;
+            } else {
+                return year;
+            }
+        }
+
         [RubyMethod("local", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("mktime", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateLocalTime(object/*!*/ self, int year) {
-            return new DateTime(year, 1, 1);
+            return new DateTime(NormalizeYear(year), 1, 1);
         }
 
         [RubyMethod("local", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("mktime", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateLocalTime(object/*!*/ self, int year, int month) {
-            return new DateTime(year, month, 1);
+            return new DateTime(NormalizeYear(year), month, 1);
         }
 
         [RubyMethod("local", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("mktime", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateLocalTime(object/*!*/ self, int year, int month, int day) {
-            return new DateTime(year, month, day);
+            return new DateTime(NormalizeYear(year), month, day);
         }
 
         [RubyMethod("local", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("mktime", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateLocalTime(object/*!*/ self, int year, int month, int day, int hour) {
-            return new DateTime(year, month, day, hour, 0, 0);
+            return new DateTime(NormalizeYear(year), month, day, hour, 0, 0);
         }
 
         [RubyMethod("local", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("mktime", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateLocalTime(object/*!*/ self, int year, int month, int day, int hour, int minute) {
-            return new DateTime(year, month, day, hour, minute, 0);
+            return new DateTime(NormalizeYear(year), month, day, hour, minute, 0);
         }
 
         [RubyMethod("local", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("mktime", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateLocalTime(object/*!*/ self, int year, int month, int day, int hour, int minute, int second) {
-            return new DateTime(year, month, day, hour, minute, second);
+            return new DateTime(NormalizeYear(year), month, day, hour, minute, second);
         }
 
         [RubyMethod("local", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("mktime", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateLocalTime(object/*!*/ self, int year, int month, int day, int hour, int minute, int second, int microsecond) {
-            return new DateTime(year, month, day, hour, minute, second).AddTicks(microsecond*10);
+            return new DateTime(NormalizeYear(year), month, day, hour, minute, second).AddTicks(microsecond*10);
         }
 
+        private static int GetComponent(ConversionStorage<int>/*!*/ conversionStorage, object[] components, int index, int defValue, bool zeroOk) {
+            if (index >= components.Length || components[index] == null) {
+                return defValue;
+            }
+
+            object component = components[index];
+
+            int result;
+            try {
+                result = Protocols.CastToFixnum(conversionStorage, component);
+            } catch (InvalidOperationException) {
+                MutableString str = component as MutableString;
+                if (str == null) {
+                    throw;
+                }
+                result = checked((int)MutableStringOps.ToInteger(str, 10));
+            }
+
+            if (result == 0 && !zeroOk) {
+                return defValue;
+            } else {
+                return result;
+            }
+        }
+
         private static int GetComponent(ConversionStorage<int>/*!*/ conversionStorage, object[] components, int index, int defValue) {
+            return GetComponent(conversionStorage, components, index, defValue, true);
+        }
+
+        private static int GetYearComponent(ConversionStorage<int>/*!*/ conversionStorage, object[] components, int index) {
+            return GetComponent(conversionStorage, components, index, 2000, false);
+        }
+
+        private static string[] /*!*/ _Months = new string[12] {
+            "jan",
+            "feb",
+            "mar",
+            "apr",
+            "may",
+            "jun",
+            "jul",
+            "aug",
+            "sep",
+            "oct",
+            "nov",
+            "dec"
+        };
+
+        private static int GetMonthComponent(ConversionStorage<int>/*!*/ conversionStorage, ConversionStorage<MutableString>/*!*/ strConversionStorage, 
+            object[] components, int index) {
+            const int defValue = 1;
             if (index >= components.Length || components[index] == null) {
                 return defValue;
             }
-            return Protocols.CastToFixnum(conversionStorage, components[index]);
+
+            MutableString asStr = Protocols.TryCastToString(strConversionStorage, components[index]);
+            if (asStr != null) {
+                string str = asStr.ConvertToString();
+
+                for (int i = 0; i < 12; i++) {
+                    if (String.Compare(str, _Months[i], CultureInfo.InvariantCulture, CompareOptions.IgnoreCase) == 0) {
+                        return i + 1;
+                    }
+                }
+
+                components[index] = asStr; // fall through after modifying the array
+            }
+
+            return GetComponent(conversionStorage, components, index, defValue, false);
         }
 
         [RubyMethod("local", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("mktime", RubyMethodAttributes.PublicSingleton)]
-        public static DateTime CreateLocalTime(ConversionStorage<int>/*!*/ conversionStorage, object/*!*/ self, [NotNull]params object[]/*!*/ components) {
+        public static DateTime CreateLocalTime(ConversionStorage<int>/*!*/ conversionStorage, ConversionStorage<MutableString>/*!*/ strConversionStorage, 
+            object/*!*/ self, [NotNull]params object[]/*!*/ components) {
 
             if (components.Length > 7 || components.Length == 0) {
                 throw RubyExceptions.CreateArgumentError(String.Format("wrong number of arguments ({0} for 7)", components.Length));
             }
             
-            return new DateTime(Protocols.CastToFixnum(conversionStorage, components[0]),
-                GetComponent(conversionStorage, components, 1, 1),
+            return new DateTime(
+                GetYearComponent(conversionStorage, components, 0),
+                GetMonthComponent(conversionStorage, strConversionStorage, components, 1),
                 GetComponent(conversionStorage, components, 2, 1),
                 GetComponent(conversionStorage, components, 3, 0),
                 GetComponent(conversionStorage, components, 4, 0),
@@ -154,56 +228,65 @@
         [RubyMethod("utc", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("gm", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateGmtTime(object/*!*/ self, int year) {
-            return new DateTime(year, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+            return new DateTime(NormalizeYear(year), 1, 1, 0, 0, 0, DateTimeKind.Utc);
         }
 
         [RubyMethod("utc", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("gm", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateGmtTime(object/*!*/ self, int year, int month) {
-            return new DateTime(year, month, 1, 0, 0, 0, DateTimeKind.Utc);
+            return new DateTime(NormalizeYear(year), month, 1, 0, 0, 0, DateTimeKind.Utc);
         }
 
         [RubyMethod("utc", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("gm", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateGmtTime(object/*!*/ self, int year, int month, int day) {
-            return new DateTime(year, month, day, 0, 0, 0, DateTimeKind.Utc);
+            return new DateTime(NormalizeYear(year), month, day, 0, 0, 0, DateTimeKind.Utc);
         }
 
         [RubyMethod("utc", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("gm", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateGmtTime(object/*!*/ self, int year, int month, int day, int hour) {
-            return new DateTime(year, month, day, hour, 0, 0, DateTimeKind.Utc);
+            return new DateTime(NormalizeYear(year), month, day, hour, 0, 0, DateTimeKind.Utc);
         }
 
         [RubyMethod("utc", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("gm", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateGmtTime(object/*!*/ self, int year, int month, int day, int hour, int minute) {
-            return new DateTime(year, month, day, hour, minute, 0, DateTimeKind.Utc);
+            return new DateTime(NormalizeYear(year), month, day, hour, minute, 0, DateTimeKind.Utc);
         }
 
         [RubyMethod("utc", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("gm", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateGmtTime(object/*!*/ self, int year, int month, int day, int hour, int minute, int second) {
-            return new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc);
+            return new DateTime(NormalizeYear(year), month, day, hour, minute, second, DateTimeKind.Utc);
         }
 
         [RubyMethod("utc", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("gm", RubyMethodAttributes.PublicSingleton)]
         public static DateTime CreateGmtTime(object/*!*/ self, int year, int month, int day, int hour, int minute, int second, int microsecond) {
-            return new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc).AddTicks(microsecond * 10);
+            return new DateTime(NormalizeYear(year), month, day, hour, minute, second, DateTimeKind.Utc).AddTicks(microsecond * 10);
         }
 
         [RubyMethod("utc", RubyMethodAttributes.PublicSingleton)]
         [RubyMethod("gm", RubyMethodAttributes.PublicSingleton)]
-        public static DateTime CreateGmtTime(ConversionStorage<int>/*!*/ conversionStorage, RubyContext/*!*/ context, object/*!*/ self, 
+        public static DateTime CreateGmtTime(ConversionStorage<int>/*!*/ conversionStorage, ConversionStorage<MutableString>/*!*/ strConversionStorage, 
+            RubyContext/*!*/ context, object/*!*/ self, 
             [NotNull]params object[]/*!*/ components) {
 
-            if (components.Length > 7 || components.Length == 0) {
+            if (components.Length == 10) {
+                // 10 arguments in the order output by Time#to_a are permitted.
+                // The last 4 are ignored. The first 6 need to be used in the reverse order
+                object[] newComponents = new object[6];
+                Array.Copy(components, newComponents, 6);
+                Array.Reverse(newComponents);
+                components = newComponents;
+            } else if (components.Length > 10 || components.Length == 0) {
                 throw RubyExceptions.CreateArgumentError(String.Format("wrong number of arguments ({0} for 7)", components.Length));
             }
+
             return new DateTime(
-                Protocols.CastToFixnum(conversionStorage, components[0]),
-                GetComponent(conversionStorage, components, 1, 1),
+                GetYearComponent(conversionStorage, components, 0),
+                GetMonthComponent(conversionStorage, strConversionStorage, components, 1),
                 GetComponent(conversionStorage, components, 2, 1),
                 GetComponent(conversionStorage, components, 3, 0),
                 GetComponent(conversionStorage, components, 4, 0),
===================================================================
