Index: doc/reference/modules/basic_mapping.xml
===================================================================
--- doc/reference/modules/basic_mapping.xml (revision 2985)
+++ doc/reference/modules/basic_mapping.xml (working copy)
@@ -2136,7 +2136,8 @@
Decimal
System.Decimal
DbType.Decimal
- Default when no type attribute specified.
+ Default when no type attribute specified.
+ The DateTimeKind is DateTimeKind.Unspecified
Double
@@ -2169,6 +2170,12 @@
Default when no type attribute specified.
+ LocalDateTime
+ System.DateTime
+ DbType.DateTime - ignores the milliseconds
+ Ensures the DateTimeKind is set to DateTimeKind.Local
+
+
PersistentEnum
A System.Enum
The DbType for the underlying value.
@@ -2207,6 +2214,12 @@
type="TrueFalse" must be specified.
+ UtcDateTime
+ System.DateTime
+ DbType.DateTime - ignores the milliseconds
+ Ensures the DateTimeKind is set to DateTimeKind.Utc
+
+
YesNo
System.Boolean
DbType.AnsiStringFixedLength - 1 char either 'Y' or 'N'
Index: src/NHibernate.Test/NHibernate.Test-2.0.csproj
===================================================================
--- src/NHibernate.Test/NHibernate.Test-2.0.csproj (revision 2985)
+++ src/NHibernate.Test/NHibernate.Test-2.0.csproj (working copy)
@@ -569,6 +569,7 @@
+
@@ -582,6 +583,8 @@
+
+
@@ -966,6 +969,9 @@
+
+
+
Index: src/NHibernate.Test/TypesTest/DateTimeClass.cs
===================================================================
--- src/NHibernate.Test/TypesTest/DateTimeClass.cs (revision 0)
+++ src/NHibernate.Test/TypesTest/DateTimeClass.cs (revision 0)
@@ -0,0 +1,32 @@
+using System;
+
+namespace NHibernate.Test.TypesTest
+{
+ ///
+ /// Summary description for GuidClass.
+ ///
+ public class DateTimeClass
+ {
+ private int _id;
+ private DateTime? _utcDateTimeValue;
+ private DateTime? _localDateTimeValue;
+
+ public int Id
+ {
+ get { return _id; }
+ set { _id = value; }
+ }
+
+ public DateTime? UtcDateTimeValue
+ {
+ get { return _utcDateTimeValue; }
+ set { _utcDateTimeValue = value; }
+ }
+
+ public DateTime? LocalDateTimeValue
+ {
+ get { return _localDateTimeValue; }
+ set { _localDateTimeValue = value; }
+ }
+ }
+}
\ No newline at end of file
Index: src/NHibernate.Test/TypesTest/DateTimeClass.hbm.xml
===================================================================
--- src/NHibernate.Test/TypesTest/DateTimeClass.hbm.xml (revision 0)
+++ src/NHibernate.Test/TypesTest/DateTimeClass.hbm.xml (revision 0)
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: src/NHibernate.Test/TypesTest/LocalDateTimeTypeFixture.cs
===================================================================
--- src/NHibernate.Test/TypesTest/LocalDateTimeTypeFixture.cs (revision 0)
+++ src/NHibernate.Test/TypesTest/LocalDateTimeTypeFixture.cs (revision 0)
@@ -0,0 +1,43 @@
+using System;
+using NUnit.Framework;
+
+namespace NHibernate.Test.TypesTest
+{
+ ///
+ /// The Unit Tests for the UtcDateTimeType.
+ ///
+ [TestFixture]
+ public class LocalDateTimeTypeFixture : TypeFixtureBase
+ {
+ protected override string TypeName
+ {
+ get { return "DateTime"; }
+ }
+
+ [Test]
+ public void ReadWrite()
+ {
+ DateTime val = DateTime.UtcNow;
+ DateTime expected = new DateTime(val.Year, val.Month, val.Day, val.Hour, val.Minute, val.Second, DateTimeKind.Local);
+
+ DateTimeClass basic = new DateTimeClass();
+ basic.Id = 1;
+ basic.LocalDateTimeValue = val;
+
+ ISession s = OpenSession();
+ s.Save(basic);
+ s.Flush();
+ s.Close();
+
+ s = OpenSession();
+ basic = (DateTimeClass) s.Load(typeof (DateTimeClass), 1);
+
+ Assert.AreEqual(DateTimeKind.Local, basic.LocalDateTimeValue.Value.Kind);
+ Assert.AreEqual(expected, basic.LocalDateTimeValue.Value);
+
+ s.Delete(basic);
+ s.Flush();
+ s.Close();
+ }
+ }
+}
\ No newline at end of file
Index: src/NHibernate.Test/TypesTest/UtcDateTimeTypeFixture.cs
===================================================================
--- src/NHibernate.Test/TypesTest/UtcDateTimeTypeFixture.cs (revision 0)
+++ src/NHibernate.Test/TypesTest/UtcDateTimeTypeFixture.cs (revision 0)
@@ -0,0 +1,43 @@
+using System;
+using NUnit.Framework;
+
+namespace NHibernate.Test.TypesTest
+{
+ ///
+ /// The Unit Tests for the UtcDateTimeType.
+ ///
+ [TestFixture]
+ public class UtcDateTimeTypeFixture : TypeFixtureBase
+ {
+ protected override string TypeName
+ {
+ get { return "DateTime"; }
+ }
+
+ [Test]
+ public void ReadWrite()
+ {
+ DateTime val = DateTime.UtcNow;
+ DateTime expected = new DateTime(val.Year, val.Month, val.Day, val.Hour, val.Minute, val.Second, DateTimeKind.Utc);
+
+ DateTimeClass basic = new DateTimeClass();
+ basic.Id = 1;
+ basic.UtcDateTimeValue = val;
+
+ ISession s = OpenSession();
+ s.Save(basic);
+ s.Flush();
+ s.Close();
+
+ s = OpenSession();
+ basic = (DateTimeClass) s.Load(typeof (DateTimeClass), 1);
+
+ Assert.AreEqual(DateTimeKind.Utc, basic.UtcDateTimeValue.Value.Kind);
+ Assert.AreEqual(expected, basic.UtcDateTimeValue.Value);
+
+ s.Delete(basic);
+ s.Flush();
+ s.Close();
+ }
+ }
+}
\ No newline at end of file
Index: src/NHibernate/NHibernate-2.0.csproj
===================================================================
--- src/NHibernate/NHibernate-2.0.csproj (revision 2985)
+++ src/NHibernate/NHibernate-2.0.csproj (working copy)
@@ -874,6 +874,7 @@
+
@@ -891,6 +892,7 @@
Code
+
Index: src/NHibernate/NHibernateUtil.cs
===================================================================
--- src/NHibernate/NHibernateUtil.cs (revision 2985)
+++ src/NHibernate/NHibernateUtil.cs (working copy)
@@ -58,6 +58,16 @@
///
/// NHibernate date type
///
+ public static readonly NullableType LocalDateTime = new LocalDateTimeType();
+
+ ///
+ /// NHibernate date type
+ ///
+ public static readonly NullableType UtcDateTime = new UtcDateTimeType();
+
+ ///
+ /// NHibernate date type
+ ///
public static readonly NullableType Date = new DateType();
///
Index: src/NHibernate/Type/DateTimeType.cs
===================================================================
--- src/NHibernate/Type/DateTimeType.cs (revision 2985)
+++ src/NHibernate/Type/DateTimeType.cs (working copy)
@@ -6,6 +6,7 @@
namespace NHibernate.Type
{
+
///
/// Maps a Property to a column that
/// stores date & time down to the accuracy of a second.
@@ -32,7 +33,7 @@
public override object Get(IDataReader rs, int index)
{
DateTime dbValue = Convert.ToDateTime(rs[index]);
- return new DateTime(dbValue.Year, dbValue.Month, dbValue.Day, dbValue.Hour, dbValue.Minute, dbValue.Second);
+ return CreateDateTime(dbValue);
}
///
@@ -62,10 +63,15 @@
{
IDataParameter parm = st.Parameters[index] as IDataParameter;
DateTime dateValue = (DateTime) value;
- parm.Value =
- new DateTime(dateValue.Year, dateValue.Month, dateValue.Day, dateValue.Hour, dateValue.Minute, dateValue.Second);
+ parm.Value = CreateDateTime(dateValue);
}
+ protected virtual DateTimeKind DateTimeKind { get { return DateTimeKind.Unspecified; } }
+ protected virtual DateTime CreateDateTime(DateTime dateValue)
+ {
+ return new DateTime(dateValue.Year, dateValue.Month, dateValue.Day, dateValue.Hour, dateValue.Minute, dateValue.Second, DateTimeKind);
+ }
+
///
///
///
@@ -92,7 +98,8 @@
date1.Day == date2.Day &&
date1.Hour == date2.Hour &&
date1.Minute == date2.Minute &&
- date1.Second == date2.Second);
+ date1.Second == date2.Second &&
+ date1.Kind == date2.Kind);
}
public override int GetHashCode(object x, ISessionFactoryImplementor factory)
@@ -107,6 +114,7 @@
hashCode = 31 * hashCode + date.Day;
hashCode = 31 * hashCode + date.Month;
hashCode = 31 * hashCode + date.Year;
+ hashCode = 31 * hashCode + date.Kind.GetHashCode();
return hashCode;
}
@@ -144,7 +152,7 @@
///
public override object FromStringValue(string xml)
{
- return DateTime.Parse(xml);
+ return DateTime.SpecifyKind(DateTime.Parse(xml), DateTimeKind);
}
///
@@ -175,5 +183,6 @@
}
#endregion
+
}
}
\ No newline at end of file
Index: src/NHibernate/Type/LocalDateTimeType.cs
===================================================================
--- src/NHibernate/Type/LocalDateTimeType.cs (revision 0)
+++ src/NHibernate/Type/LocalDateTimeType.cs (revision 0)
@@ -0,0 +1,18 @@
+using System;
+
+namespace NHibernate.Type
+{
+ [Serializable]
+ public class LocalDateTimeType : DateTimeType
+ {
+ protected override DateTimeKind DateTimeKind
+ {
+ get { return System.DateTimeKind.Local; }
+ }
+
+ public override string Name
+ {
+ get { return "LocalDateTime"; }
+ }
+ }
+}
\ No newline at end of file
Index: src/NHibernate/Type/TypeFactory.cs
===================================================================
--- src/NHibernate/Type/TypeFactory.cs (revision 2985)
+++ src/NHibernate/Type/TypeFactory.cs (working copy)
@@ -130,6 +130,8 @@
typeByTypeOfName[NHibernateUtil.YesNo.Name] = NHibernateUtil.YesNo;
typeByTypeOfName[NHibernateUtil.Ticks.Name] = NHibernateUtil.Ticks;
typeByTypeOfName[NHibernateUtil.TimeSpan.Name] = NHibernateUtil.TimeSpan;
+ typeByTypeOfName[NHibernateUtil.UtcDateTime.Name] = NHibernateUtil.UtcDateTime;
+ typeByTypeOfName[NHibernateUtil.LocalDateTime.Name] = NHibernateUtil.LocalDateTime;
// need to do add the key "Serializable" because the hbm files will have a
// type="Serializable", but the SerializableType returns the Name as
Index: src/NHibernate/Type/UtcDateTimeType.cs
===================================================================
--- src/NHibernate/Type/UtcDateTimeType.cs (revision 0)
+++ src/NHibernate/Type/UtcDateTimeType.cs (revision 0)
@@ -0,0 +1,18 @@
+using System;
+
+namespace NHibernate.Type
+{
+ [Serializable]
+ public class UtcDateTimeType : DateTimeType
+ {
+ protected override DateTimeKind DateTimeKind
+ {
+ get { return System.DateTimeKind.Utc; }
+ }
+
+ public override string Name
+ {
+ get { return "UtcDateTime"; }
+ }
+ }
+}
\ No newline at end of file