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