Merge pull request #1323 from StephenMcConnel/bug-23591
[mono.git] / mcs / class / Mono.Posix / Mono.Unix.Native / NativeConvert.cs
index 4c56a293d517780d16e64f0e8107db4c6cf71dad..ffa329f1b5bf3d5fa7cc75a7a6e93355b118d117 100644 (file)
@@ -183,6 +183,8 @@ namespace Mono.Unix.Native {
                        return '-';
                }
 
+               public static readonly DateTime UnixEpoch =
+                       new DateTime (year:1970, month:1, day:1, hour:0, minute:0, second:0, kind:DateTimeKind.Utc);
                public static readonly DateTime LocalUnixEpoch = 
                        new DateTime (1970, 1, 1);
                public static readonly TimeSpan LocalUtcOffset = 
@@ -193,6 +195,11 @@ namespace Mono.Unix.Native {
                        return FromTimeT (time);
                }
 
+               public static DateTime ToDateTime (long time, long nanoTime)
+               {
+                       return FromTimeT (time).AddMilliseconds (nanoTime / 1000);
+               }
+
                public static long FromDateTime (DateTime time)
                {
                        return ToTimeT (time);
@@ -200,15 +207,18 @@ namespace Mono.Unix.Native {
 
                public static DateTime FromTimeT (long time)
                {
-                       DateTime r = LocalUnixEpoch.AddSeconds ((double) time + 
-                                       LocalUtcOffset.TotalSeconds);
-                       return r;
+                       return UnixEpoch.AddSeconds (time).ToLocalTime ();
                }
 
                public static long ToTimeT (DateTime time)
                {
-                       TimeSpan unixTime = time.Subtract (LocalUnixEpoch) - LocalUtcOffset;
-                       return (long) unixTime.TotalSeconds;
+                       if (time.Kind == DateTimeKind.Unspecified)
+                               throw new ArgumentException ("DateTimeKind.Unspecified is not supported. Use Local or Utc times.", "time");
+
+                       if (time.Kind == DateTimeKind.Local)
+                               time = time.ToUniversalTime ();
+
+                       return (long) (time - UnixEpoch).TotalSeconds;
                }
 
                public static OpenFlags ToOpenFlags (FileMode mode, FileAccess access)