Index: trunk/Include/Classes/System/DateTime.ab
===================================================================
--- trunk/Include/Classes/System/DateTime.ab	(revision 400)
+++ trunk/Include/Classes/System/DateTime.ab	(revision 409)
@@ -1,62 +1,170 @@
 Namespace System
 
+/*!
+	@brief	時刻の種類
+*/
+Enum DateTimeKind
+	Local
+	Unspecified
+	Utc
+End Enum
+
+/*!
+	@brief	曜日
+*/
+Enum DayOfWeek
+	Sunday = 0
+	Monday
+	Tuesday
+	Wednesday
+	Thursday
+	Friday
+	Saturday
+End Enum
+
+
+/*!
+	@brief	時刻を表すクラス
+*/
 
 Class DateTime
 	m_Date As Int64
 Public
-	Static MaxValue = 3162240000000000000 As Int64 'Const TicksPerDay*366*10000
-	Static MinValue = 316224000000000 As Int64     'Const TicksPerDay*366
-
+	Static Const MaxValue = 3162240000000000000 As Int64 'Const TicksPerDay*366*10000
+	Static Const MinValue = 316224000000000 As Int64     'Const TicksPerDay*366
+
+	'----------------------------------------------------------------
+	' パブリック コンストラクタ
+	'----------------------------------------------------------------
+
+	/*!
+	@brief	コンストラクタ
+	*/
 	Sub DateTime()
 		initialize(MinValue, DateTimeKind.Unspecified)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  100ナノ秒単位で表した時刻
+	*/
 	Sub DateTime(ticks As Int64)
 		initialize(ticks, DateTimeKind.Unspecified)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  100ナノ秒単位で表した時刻
+	@param  時刻の種類
+	*/
 	Sub DateTime(ticks As Int64, kind As DateTimeKind)
 		initialize(ticks, kind)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  西暦
+	@param  月
+	@param  日
+	*/
 	Sub DateTime(year As Long, month As Long, day As Long)
 		initialize(year, month, day, 0, 0, 0, 0, DateTimeKind.Unspecified)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  西暦
+	@param  月
+	@param  日
+	@param  時刻の種類
+	*/
 	Sub DateTime(year As Long, month As Long, day As Long, kind As DateTimeKind)
 		initialize(year, month, day, 0, 0, 0, 0, kind)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  西暦
+	@param  月
+	@param  日
+	@param  時
+	@param  分
+	@param  秒
+	*/
 	Sub DateTime(year As Long, month As Long, day As Long, hour As Long, minute As Long, second As Long)
 		initialize(year, month, day, hour, minute, second, 0, DateTimeKind.Unspecified)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  西暦
+	@param  月
+	@param  日
+	@param  時
+	@param  分
+	@param  秒
+	@param  時刻の種類
+	*/
 	Sub DateTime(year As Long, month As Long, day As Long, hour As Long, minute As Long, second As Long, kind As DateTimeKind)
 		initialize(year, month, day, hour, minute, second, 0, kind)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  西暦
+	@param  月
+	@param  日
+	@param  時
+	@param  分
+	@param  秒
+	@param  ミリ秒
+	*/
 	Sub DateTime(year As Long, month As Long, day As Long, hour As Long, minute As Long, second As Long, millisecond As Long)
 		initialize(year, month, day, hour, minute, second, millisecond, DateTimeKind.Unspecified)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  西暦
+	@param  月
+	@param  日
+	@param  時
+	@param  分
+	@param  秒
+	@param  ミリ秒
+	@param  時刻の種類
+	*/
 	Sub DateTime(year As Long, month As Long, day As Long, hour As Long, minute As Long, second As Long, millisecond As Long, kind As DateTimeKind)
 		initialize(year, month, day, hour, minute, second, millisecond, kind)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  SYSTEMTIME構造体
+	*/
 	Sub DateTime(ByRef time As SYSTEMTIME)
 		initialize(time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds, DateTimeKind.Unspecified)
 	End Sub
 
+	/*!
+	@brief	時刻を指定して初期化する
+	@param  SYSTEMTIME構造体
+	@param  時刻の種類
+	*/
 	Sub DateTime(ByRef time As SYSTEMTIME, kind As DateTimeKind)
 		initialize(time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds, kind)
 	End Sub
 
-	'Copy Constructor
+	/*!
+	@brief	コピーコンストラクタ
+	@param  コピーするDateTime
+	*/
 	Sub DateTime(dateTime As DateTime)
 		This.m_Date = dateTime.m_Date
 	End Sub
 
-	Sub ~DateTime()
-	End Sub
+	'----------------------------------------------------------------
+	' オペレータ
+	'----------------------------------------------------------------
 
 	Function Operator + (value As TimeSpan) As DateTime
@@ -112,29 +220,60 @@
 	End Function
 	
-	'Public Properties
+	'----------------------------------------------------------------
+	' パブリック プロパティ
+	'----------------------------------------------------------------
+
+	/*!
+	@brief	時刻を100ナノ秒単位で取得する
+	@return 時刻
+	*/
 	Function Ticks() As Int64
 		Return (m_Date And &H3FFFFFFFFFFFFFFF)
 	End Function
 
+	/*!
+	@brief	時刻のミリ秒単位部分を取得する
+	@return ミリ秒の部分
+	*/
 	Function Millisecond() As Long
 		Return (Ticks \ TimeSpan.TicksPerMillisecond Mod 1000) As Long
 	End Function
 
+	/*!
+	@brief	時刻の秒単位部分を取得する
+	@return 秒の部分
+	*/
 	Function Second() As Long
 		Return (Ticks \ TimeSpan.TicksPerSecond Mod 60) As Long
 	End Function
 
+	/*!
+	@brief	時刻の分単位部分を取得する
+	@return 分の部分
+	*/
 	Function Minute() As Long
 		Return (Ticks \ TimeSpan.TicksPerMinute Mod 60) As Long
 	End Function
 
+	/*!
+	@brief	時刻の時単位部分を取得する
+	@return 時の部分
+	*/
 	Function Hour() As Long
 		Return (Ticks \ TimeSpan.TicksPerHour Mod 24) As Long
 	End Function
 
+	/*!
+	@brief	時刻の日単位部分を取得する
+	@return 日の部分
+	*/
 	Function Day() As Long
 		Return DayOfYear - totalDaysOfMonth(Year, Month - 1)
 	End Function
 
+	/*!
+	@brief	時刻の月単位部分を取得する
+	@return 月の部分
+	*/
 	Function Month() As Long
 		Dim year = Year As Long
@@ -147,4 +286,8 @@
 	End Function
 
+	/*!
+	@brief	時刻の年単位部分を取得する
+	@return 西暦
+	*/
 	Function Year() As Long
 		Dim day = (Ticks \ TimeSpan.TicksPerDay) As Long
@@ -157,20 +300,40 @@
 	End Function
 
-	Function DayOfWeek() As Long 'As DayOfWeek
-		Return ((Ticks \ TimeSpan.TicksPerDay) Mod 7) As Long + 1
-	End Function
-
+	/*!
+	@brief	時刻の曜日部分を取得する
+	@return 曜日の部分
+	*/
+	Function DayOfWeek() As DayOfWeek
+		Return New DayOfWeek( (((Ticks \ TimeSpan.TicksPerDay) Mod 7) + 1) As Long, "DayOfWeek")
+	End Function
+
+	/*!
+	@brief	時刻の種類を取得する
+	@return 種類
+	*/
 	Function Kind() As DateTimeKind
 		Return kindFromBinary(m_Date)
 	End Function
 
+	/*!
+	@brief	その年の何日目かを取得する
+	@return 日数
+	*/
 	Function DayOfYear() As Long
 		Return ((Ticks \ TimeSpan.TicksPerDay) - yearToDay(Year) + 1) As Long
 	End Function
 
+	/*!
+	@brief	時刻の日付の部分を取得する
+	@return 日付
+	*/
 	Function Date() As DateTime
 		Return New DateTime(Year, Month, Day, Kind)
 	End Function
 
+	/*!
+	@brief	現在の時刻を取得する
+	@return 時刻
+	*/
 	Static Function Now() As DateTime
 		Dim time As SYSTEMTIME
@@ -179,4 +342,8 @@
 	End Function
 
+	/*!
+	@brief	今日を表す時刻を取得する(時間は0時0分)
+	@return 時刻
+	*/
 	Static Function Today() As DateTime
 		Dim time As SYSTEMTIME
@@ -185,4 +352,8 @@
 	End Function
 
+	/*!
+	@brief	現在の時刻をUTC時刻で取得する
+	@return 時刻
+	*/
 	Static Function UtcNow() As DateTime
 		Dim time As SYSTEMTIME
@@ -191,9 +362,22 @@
 	End Function
 		
-	'Public Methods
+	'----------------------------------------------------------------
+	' パブリック メソッド
+	'----------------------------------------------------------------
+
+	/*!
+	@brief	二つの時刻の差を求める
+	@return 差(単位は100ナノ秒)
+	*/
 	Static Function Compare(t1 As DateTime, t2 As DateTime) As Int64
 		Return t1.Ticks - t2.Ticks
 	End Function
 
+	/*!
+	@brief	等しいどうかを取得する
+	@param  比較する値
+	@retval True  等しい
+	@retval False 等しくない
+	*/
 	Function Equals(value As DateTime) As Boolean
 		If value.m_Date = m_Date Then
@@ -204,4 +388,11 @@
 	End Function
 
+	/*!
+	@brief	等しいどうかを取得する
+	@param  比較される値
+	@param  比較する値
+	@retval True  等しい
+	@retval False 等しくない
+	*/
 	Static Function Equals(t1 As DateTime, t2 As DateTime) As Boolean
 		If t1.m_Date = t2.m_Date Then
@@ -212,36 +403,80 @@
 	End Function
 
+	/*!
+	@brief	ハッシュコードを取得する
+	@return ハッシュコード
+	*/
 	Override Function GetHashCode() As Long
 		Return HIDWORD(m_Date) Xor LODWORD(m_Date)
 	End Function
 
+	/*!
+	@brief	時刻を進める
+	@param  進める時間
+	@return 進めた後の時刻
+	*/
 	Function Add(value As TimeSpan) As DateTime
 		Return This + value
 	End Function
 
+	/*!
+	@brief	時刻を進める
+	@param  進める時間(100ナノ秒単位)
+	@return 進めた後の時刻
+	*/
 	Function AddTicks(value As Int64) As DateTime
 		Return New DateTime(Ticks + value, Kind )
 	End Function
 
+	/*!
+	@brief	時刻を進める
+	@param  進める時間(ミリ秒単位)
+	@return 進めた後の時刻
+	*/
 	Function AddMilliseconds(value As Double) As DateTime
 		Return AddTicks((value * TimeSpan.TicksPerMillisecond) As Int64)
 	End Function
 
+	/*!
+	@brief	時刻を進める
+	@param  進める時間(秒単位)
+	@return 進めた後の時刻
+	*/
 	Function AddSeconds(value As Double) As DateTime
 		Return AddTicks((value * TimeSpan.TicksPerSecond) As Int64)
 	End Function
 
+	/*!
+	@brief	時刻を進める
+	@param  進める時間(分単位)
+	@return 進めた後の時刻
+	*/
 	Function AddMinutes(value As Double) As DateTime
 		Return AddTicks((value * TimeSpan.TicksPerMinute) As Int64)
 	End Function
 
+	/*!
+	@brief	時刻を進める
+	@param  進める時間(時単位)
+	@return 進めた後の時刻
+	*/
 	Function AddHours(value As Double) As DateTime
 		Return AddTicks((value * TimeSpan.TicksPerHour) As Int64)
 	End Function
 
+	/*!
+	@brief	時刻を進める
+	@param  進める時間(日単位)
+	@return 進めた後の時刻
+	*/
 	Function AddDays(value As Double) As DateTime
 		Return AddTicks((value * TimeSpan.TicksPerDay) As Int64)
 	End Function
 
+	/*!
+	@brief	時刻を進める
+	@param  進める時間(年単位)
+	@return 進めた後の時刻
+	*/
 	Function AddYears(value As Double) As DateTime
 		Dim date = New DateTime(Year + Int(value), Month, Day, Hour, Minute, Second, Millisecond, Kind)
@@ -260,16 +495,34 @@
 	End Function
 
+	/*!
+	@brief	時刻の差を取得する
+	@param  比較する値
+	@return 時刻の差
+	*/
 	Function Subtract(value As DateTime) As TimeSpan
 		Return This - value
 	End Function
 
+	/*!
+	@brief	時刻を戻す
+	@param  戻す時間
+	@return 時刻
+	*/
 	Function Subtract(value As TimeSpan) As DateTime
 		Return This - value
 	End Function
 
+	/*!
+	@brief	指定した年月が、その月の何日目かを取得する
+	@param  西暦
+	@param  月
+	@return 日数
+	*/
 	Static Function DaysInMonth(year As Long, month As Long) As Long
-		If year < 1 Or year > 9999 Or month < 1 Or month > 12 Then
-			'ArgumentOutOfRangeException
-			debug
+		If year < 1 Or year > 9999 Then
+			Throw New ArgumentOutOfRangeException("DateTime.DaysInMonth: One or more arguments are out of range value.", "year")
+		End If
+		If month < 1 Or month > 12 Then
+			Throw New ArgumentOutOfRangeException("DateTime.DaysInMonth: One or more arguments are out of range value.", "month")
 		End If
 
@@ -282,4 +535,10 @@
 	End Function
 
+	/*!
+	@brief	年が閏年かどうかを取得する
+	@param  西暦
+	@retval True  閏年
+	@retval False 閏年でない
+	*/
 	Static Function IsLeapYear(year As Long) As Boolean
 		If (year Mod 400) = 0 Then Return True
@@ -289,4 +548,8 @@
 	End Function
 
+	/*!
+	@brief	時刻を文字列に変換する
+	@return 時刻を表した文字列
+	*/
 	Function GetDateTimeFormats() As String
 		Dim time = getSystemTime() 'As SYSTEMTIME を記述すると内部エラーが発生
@@ -298,8 +561,12 @@
 		dateTimeFormats[dateFormatSize - 1] = &H20 As TCHAR 'Asc(" ") As TCHAR
 		GetTimeFormat(LOCALE_USER_DEFAULT, 0, time, NULL, dateTimeFormats + dateFormatSize, timeFormatSize)
-'Debug
 		Return New String(dateTimeFormats, strLength)
 	End Function
 
+	/*!
+	@brief	時刻を指定した書式で文字列に変換する
+	@param  書式
+	@return 時刻を表した文字列
+	*/
 	Function GetDateTimeFormats(format As *TCHAR) As String
 		Dim time = getSystemTime() 'As SYSTEMTIME を記述すると内部エラーが発生
@@ -315,12 +582,24 @@
 	End Function
 
+	/*!
+	@brief	バイナリデータからDateTimeを作成する
+	@return DateTimeクラス
+	*/
 	Static Function FromBinary(date As Int64) As DateTime
 		Return New DateTime((date And &H3FFFFFFFFFFFFFFF), kindFromBinary(date))
 	End Function
 
+	/*!
+	@brief	バイナリデータに変換する
+	@return バイナリデータ
+	*/
 	Function ToBinary() As Int64
 		Return m_Date
 	End Function
 
+	/*!
+	@brief	FILETIME構造体からDateTimeを作成する
+	@return DateTimeクラス
+	*/
 	Static Function FromFileTime(ByRef fileTime As FILETIME) As DateTime
 		Dim localTime As FILETIME
@@ -331,4 +610,8 @@
 	End Function
 
+	/*!
+	@brief	FILETIME構造体に変換する
+	@return FILETIME構造体
+	*/
 	Function ToFileTime() As FILETIME
 		Dim time = getSystemTime() 'As SYSTEMTIME を記述すると内部エラーが発生 rev.207
@@ -338,4 +621,8 @@
 	End Function
 
+	/*!
+	@brief	UTC時刻を表すFILETIME構造体からDateTimeを作成する
+	@return DateTimeクラス
+	*/
 	Static Function FromFileTimeUtc(ByRef fileTime As FILETIME) As DateTime
 		Dim time As SYSTEMTIME
@@ -344,4 +631,8 @@
 	End Function
 
+	/*!
+	@brief	UTC時刻のFILETIME構造体に変換する
+	@return FILETIME構造体
+	*/
 	Function ToFileTimeUtc() As FILETIME
 		Dim fileTime = ToFileTime() 'As FILETIME を記述すると内部エラー rev.207
@@ -355,4 +646,8 @@
 	End Function
 
+	/*!
+	@brief	現地時刻に変換する
+	@return 現地時刻に変換したDateTime
+	*/
 	Function ToLocalTime() As DateTime
 		If Kind = DateTimeKind.Local Then
@@ -364,8 +659,16 @@
 	End Function
 
+	/*!
+	@brief	このインスタンスを文字列で取得する
+	@return 文字列
+	*/
 	Override Function ToString() As String
 		Return GetDateTimeFormats()
 	End Function
 
+	/*!
+	@brief	世界協定時刻(UTC)に変換する
+	@return 世界協定時刻(UTC)に変換したDateTime
+	*/
 	Function ToUniversalTime() As DateTime
 		If Kind = DateTimeKind.Utc Then
@@ -377,5 +680,14 @@
 	End Function
 
+	'----------------------------------------------------------------
+	' プライベート メソッド
+	'----------------------------------------------------------------
 Private
+
+	/*!
+	@brief	インスタンスを初期化する
+	@param  時刻(100ナノ秒単位)
+	@param  時刻の種類
+	*/
 	Sub initialize(ticks As Int64, kind As DateTimeKind)
 		Kind = kind
@@ -383,12 +695,33 @@
 	End Sub
 
+	/*!
+	@brief	インスタンスを初期化する
+	@param  西暦
+	@param  月
+	@param  日
+	@param  時
+	@param  分
+	@param  秒
+	@param  ミリ秒
+	@param  時刻の種類
+	*/
 	Sub initialize(year As Long, month As Long, day As Long, hour As Long, minute As Long, second As Long, millisecond As Long, kind As DateTimeKind)
-		If month < 1 Or month > 12 _
-			Or day < 1 Or day > DaysInMonth(year, month) _
-			Or hour < 0 Or hour => 24 _
-			Or minute < 0 Or minute => 60 _
-			Or second < 0 Or second => 60 _
-			Or millisecond < 0 Or millisecond  => 1000 Then
-			debug 'ArgumentOutOfRangeException
+		If month < 1 Or month > 12 Then
+			Throw New ArgumentOutOfRangeException("DateTime.initialize: One or more arguments are out of range value.", "month")
+		End If
+		If day < 1 Or day > DaysInMonth(year, month) Then
+			Throw New ArgumentOutOfRangeException("DateTime.initialize: One or more arguments are out of range value.", "day")
+		End If
+		If hour < 0 Or hour => 24 Then
+			Throw New ArgumentOutOfRangeException("DateTime.initialize: One or more arguments are out of range value.", "hour")
+		End If
+		If minute < 0 Or minute => 60 Then
+			Throw New ArgumentOutOfRangeException("DateTime.initialize: One or more arguments are out of range value.", "minute")
+		End If
+		If second < 0 Or second => 60 Then
+			Throw New ArgumentOutOfRangeException("DateTime.initialize: One or more arguments are out of range value.", "second")
+		End If
+		If millisecond < 0 Or millisecond  => 1000 Then
+			Throw New ArgumentOutOfRangeException("DateTime.initialize: One or more arguments are out of range value.", "millisecond")
 		End If
 
@@ -405,7 +738,11 @@
 	End Sub
 
+	/*!
+	@brief	時刻を設定する
+	@param  時刻(100ナノ秒単位)
+	*/
 	Sub Ticks(value As Int64)
 		If value < MinValue Or value > MaxValue Then
-			debug 'ArgumentOutOfRangeException
+			Throw New ArgumentOutOfRangeException("DateTime.value: One or more arguments are out of range value.", "value")
 		End If
 
@@ -415,4 +752,8 @@
 	End Sub
 
+	/*!
+	@brief	時刻の種類を設定する
+	@param  時刻の種類
+	*/
 	Sub Kind(kind As DateTimeKind)
 		Dim temp As Int64
@@ -422,4 +763,8 @@
 	End Sub
 
+	/*!
+	@brief	バイナリデータから時刻の種類を取得する
+	@return 時刻の種類
+	*/
 	Static Function kindFromBinary(date As Int64) As DateTimeKind
 		date = (date >> 62) And &H03
@@ -431,15 +776,17 @@
 			Return DateTimeKind.Utc
 		End If
-
-		' ここにはこないはず
-		debug
-	End Function
-
+	End Function
+
+	/*!
+	@brief	インスタンスをSYSTEMTIME構造体に変換する
+	@return SYSTEMTIME構造体
+	*/
 	Function getSystemTime() As SYSTEMTIME
+		Dim dayOfWeek = DayOfWeek As Long
 		Dim time As SYSTEMTIME
 		With time
 			.wYear = Year As Word
 			.wMonth = Month As Word
-			.wDayOfWeek = DayOfWeek As Word
+			.wDayOfWeek = dayOfWeek As Word
 			.wDay = Day As Word
 			.wHour = Hour As Word
@@ -451,4 +798,8 @@
 	End Function
 
+	/*!
+	@brief	西暦から日数に変換する
+	@return 日数
+	*/
 	Static Function yearToDay(year As Long) As Long
 		year--
@@ -456,4 +807,8 @@
 	End Function
 
+	/*!
+	@brief	その月までその年の元旦から何日経っているかを取得する
+	@return 日数
+	*/
 	Static Function totalDaysOfMonth(year As Long, month As Long) As Long
 		Dim days As Long
@@ -466,20 +821,3 @@
 End Class
 
-Enum DateTimeKind
-	Local
-	Unspecified
-	Utc
-End Enum
-
-Enum DayOfWeek
-	Sunday = 0
-	Monday
-	Tuesday
-	Wednesday
-	Thursday
-	Friday
-	Saturday
-End Enum
-
-
 End Namespace
