Составить описание класса для представления даты - C# (201449)
Формулировка задачи:
Составить описание класса для представления даты. Предусмотреть возможности установки даты и изменения ее отдельных полей (год, месяц, день) с проверкой__ допустимости вводимых значений. В случае недопустимых значений полей выбрасываются исключения. Создать методы изменения даты на заданное количество дней, месяцев и лет.
Написать программу, демонстрирующую все разработанные элементы класса.
Программу написать на C#
Решение задачи: «Составить описание класса для представления даты»
textual
Листинг программы
// Type: System.DateTime
// Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
using System.Globalization;
using System.Runtime;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Security;
namespace System
{
/// <summary>
/// Represents an instant in time, typically expressed as a date and time of day.
/// </summary>
/// <filterpriority>1</filterpriority>
[Serializable]
[StructLayout(LayoutKind.Auto)]
public struct DateTime
{
private static readonly int[] DaysToMonth365 = new int[13]
{
0,
31,
59,
90,
120,
151,
181,
212,
243,
273,
304,
334,
365
};
private static readonly int[] DaysToMonth366 = new int[13]
{
0,
31,
60,
91,
121,
152,
182,
213,
244,
274,
305,
335,
366
};
/// <summary>
/// Represents the smallest possible value of <see cref="T:System.DateTime"/>. This field is read-only.
/// </summary>
/// <filterpriority>1</filterpriority>
public static readonly DateTime MinValue = new DateTime(0L, DateTimeKind.Unspecified);
/// <summary>
/// Represents the largest possible value of <see cref="T:System.DateTime"/>. This field is read-only.
/// </summary>
/// <exception cref="T:System.ArgumentOutOfRangeException"><see cref="F:System.DateTime.MaxValue"/> is outside the range of the current culture's default calendar or of a specified culture's default calendar.</exception><filterpriority>1</filterpriority>
public static readonly DateTime MaxValue = new DateTime(3155378975999999999L, DateTimeKind.Unspecified);
internal const long MinTicks = 0L;
internal const long MaxTicks = 3155378975999999999L;
private readonly ulong dateData;
internal long InternalTicks
{
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
get { return (long) dateData & 4611686018427387903L; }
}
private ulong InternalKind
{
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
get { return dateData & 13835058055282163712UL; }
}
/// <summary>
/// Gets the date component of this instance.
/// </summary>
///
/// <returns>
/// A new <see cref="T:System.DateTime"/> with the same date as this instance, and the time value set to 12:00:00 midnight (00:00:00).
/// </returns>
/// <filterpriority>1</filterpriority>
public DateTime Date
{
get
{
long internalTicks = InternalTicks;
return new DateTime((ulong) (internalTicks - internalTicks%864000000000L) | InternalKind);
}
}
/// <summary>
/// Gets the day of the month represented by this instance.
/// </summary>
///
/// <returns>
/// The day component, expressed as a value between 1 and 31.
/// </returns>
/// <filterpriority>1</filterpriority>
public int Day
{
get { return GetDatePart(3); }
}
/// <summary>
/// Gets the day of the week represented by this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DayOfWeek"/> enumerated constant that indicates the day of the week of this <see cref="T:System.DateTime"/> value.
/// </returns>
/// <filterpriority>1</filterpriority>
public DayOfWeek DayOfWeek
{
get { return (DayOfWeek) ((InternalTicks/864000000000L + 1L)%7L); }
}
/// <summary>
/// Gets the day of the year represented by this instance.
/// </summary>
///
/// <returns>
/// The day of the year, expressed as a value between 1 and 366.
/// </returns>
/// <filterpriority>1</filterpriority>
public int DayOfYear
{
get { return GetDatePart(1); }
}
/// <summary>
/// Gets the hour component of the date represented by this instance.
/// </summary>
///
/// <returns>
/// The hour component, expressed as a value between 0 and 23.
/// </returns>
/// <filterpriority>1</filterpriority>
public int Hour
{
get { return (int) (InternalTicks/36000000000L%24L); }
}
/// <summary>
/// Gets a value that indicates whether the time represented by this instance is based on local time, Coordinated Universal Time (UTC), or neither.
/// </summary>
///
/// <returns>
/// One of the <see cref="T:System.DateTimeKind"/> values. The default is <see cref="F:System.DateTimeKind.Unspecified"/>.
/// </returns>
/// <filterpriority>1</filterpriority>
public DateTimeKind Kind
{
get
{
switch (InternalKind)
{
case 0UL:
return DateTimeKind.Unspecified;
case 4611686018427387904UL:
return DateTimeKind.Utc;
default:
return DateTimeKind.Local;
}
}
}
/// <summary>
/// Gets the milliseconds component of the date represented by this instance.
/// </summary>
///
/// <returns>
/// The milliseconds component, expressed as a value between 0 and 999.
/// </returns>
/// <filterpriority>1</filterpriority>
public int Millisecond
{
get { return (int) (InternalTicks/10000L%1000L); }
}
/// <summary>
/// Gets the minute component of the date represented by this instance.
/// </summary>
///
/// <returns>
/// The minute component, expressed as a value between 0 and 59.
/// </returns>
/// <filterpriority>1</filterpriority>
public int Minute
{
get { return (int) (InternalTicks/600000000L%60L); }
}
/// <summary>
/// Gets the month component of the date represented by this instance.
/// </summary>
///
/// <returns>
/// The month component, expressed as a value between 1 and 12.
/// </returns>
/// <filterpriority>1</filterpriority>
public int Month
{
get { return GetDatePart(2); }
}
/// <summary>
/// Gets a <see cref="T:System.DateTime"/> object that is set to the current date and time on this computer, expressed as the local time.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the current local date and time.
/// </returns>
/// <filterpriority>1</filterpriority>
public static DateTime Now
{
get
{
DateTime utcNow = UtcNow;
const bool isAmbiguousLocalDst = false;
long ticks2 = utcNow.Ticks;
if (ticks2 > 3155378975999999999L)
return new DateTime(3155378975999999999L, DateTimeKind.Local);
if (ticks2 < 0L)
return new DateTime(0L, DateTimeKind.Local);
else
return new DateTime(ticks2, DateTimeKind.Local, isAmbiguousLocalDst);
}
}
/// <summary>
/// Gets a <see cref="T:System.DateTime"/> object that is set to the current date and time on this computer, expressed as the Coordinated Universal Time (UTC).
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the current UTC date and time.
/// </returns>
/// <filterpriority>1</filterpriority>
public static DateTime UtcNow
{
get { return new DateTime((ulong) (GetSystemTimeAsFileTime() + 504911232000000000L | 4611686018427387904L)); }
}
/// <summary>
/// Gets the seconds component of the date represented by this instance.
/// </summary>
///
/// <returns>
/// The seconds, between 0 and 59.
/// </returns>
/// <filterpriority>1</filterpriority>
public int Second
{
get { return (int) (InternalTicks/10000000L%60L); }
}
/// <summary>
/// Gets the number of ticks that represent the date and time of this instance.
/// </summary>
///
/// <returns>
/// The number of ticks that represent the date and time of this instance. The value is between DateTime.MinValue.Ticks and DateTime.MaxValue.Ticks.
/// </returns>
/// <filterpriority>1</filterpriority>
public long Ticks
{
get { return InternalTicks; }
}
/// <summary>
/// Gets the time of day for this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.TimeSpan"/> that represents the fraction of the day that has elapsed since midnight.
/// </returns>
/// <filterpriority>1</filterpriority>
public TimeSpan TimeOfDay
{
get { return new TimeSpan(InternalTicks%864000000000L); }
}
/// <summary>
/// Gets the current date.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> set to today's date, with the time component set to 00:00:00.
/// </returns>
/// <filterpriority>1</filterpriority>
public static DateTime Today
{
get { return Now.Date; }
}
/// <summary>
/// Gets the year component of the date represented by this instance.
/// </summary>
///
/// <returns>
/// The year, between 1 and 9999.
/// </returns>
/// <filterpriority>1</filterpriority>
public int Year
{
get { return GetDatePart(0); }
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to a specified number of ticks.
/// </summary>
/// <param name="ticks">A date and time expressed in 100-nanosecond units. </param><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="ticks"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception>
public DateTime(long ticks)
{
if (ticks < 0L || ticks > 3155378975999999999L)
throw new ArgumentOutOfRangeException("ticks");
dateData = (ulong) ticks;
}
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
private DateTime(ulong dateData)
{
this.dateData = dateData;
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to a specified number of ticks and to Coordinated Universal Time (UTC) or local time.
/// </summary>
/// <param name="ticks">A date and time expressed in 100-nanosecond units. </param><param name="kind">One of the enumeration values that indicates whether <paramref name="ticks"/> specifies a local time, Coordinated Universal Time (UTC), or neither.</param><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="ticks"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><exception cref="T:System.ArgumentException"><paramref name="kind"/> is not one of the <see cref="T:System.DateTimeKind"/> values.</exception>
public DateTime(long ticks, DateTimeKind kind)
{
if (ticks < 0L || ticks > 3155378975999999999L)
throw new ArgumentOutOfRangeException("ticks");
if (kind < DateTimeKind.Unspecified || kind > DateTimeKind.Local)
throw new ArgumentException("kind");
dateData = (ulong) (ticks | (long) kind << 62);
}
internal DateTime(long ticks, DateTimeKind kind, bool isAmbiguousDst)
{
if (ticks < 0L || ticks > 3155378975999999999L)
throw new ArgumentOutOfRangeException("ticks");
dateData = (ulong) (ticks | (isAmbiguousDst ? -4611686018427387904L : long.MinValue));
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, and day.
/// </summary>
/// <param name="year">The year (1 through 9999). </param><param name="month">The month (1 through 12). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is less than 1 or greater than 9999.-or- <paramref name="month"/> is less than 1 or greater than 12.-or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>. </exception><exception cref="T:System.ArgumentException">The specified parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. </exception>
public DateTime(int year, int month, int day)
{
dateData = (ulong) DateToTicks(year, month, day);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, and day for the specified calendar.
/// </summary>
/// <param name="year">The year (1 through the number of years in <paramref name="calendar"/>). </param><param name="month">The month (1 through the number of months in <paramref name="calendar"/>). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><param name="calendar">The calendar that is used to interpret <paramref name="year"/>, <paramref name="month"/>, and <paramref name="day"/>. </param><exception cref="T:System.ArgumentNullException"><paramref name="calendar"/> is null.</exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is not in the range supported by <paramref name="calendar"/>.-or- <paramref name="month"/> is less than 1 or greater than the number of months in <paramref name="calendar"/>.-or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>. </exception><exception cref="T:System.ArgumentException">The specified parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. </exception>
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public DateTime(int year, int month, int day, Calendar calendar)
{
this = new DateTime(year, month, day, 0, 0, 0, calendar);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, day, hour, minute, and second.
/// </summary>
/// <param name="year">The year (1 through 9999). </param><param name="month">The month (1 through 12). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><param name="hour">The hours (0 through 23). </param><param name="minute">The minutes (0 through 59). </param><param name="second">The seconds (0 through 59). </param><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is less than 1 or greater than 9999. -or- <paramref name="month"/> is less than 1 or greater than 12. -or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>.-or- <paramref name="hour"/> is less than 0 or greater than 23. -or- <paramref name="minute"/> is less than 0 or greater than 59. -or- <paramref name="second"/> is less than 0 or greater than 59. </exception><exception cref="T:System.ArgumentException">The specified parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. </exception>
public DateTime(int year, int month, int day, int hour, int minute, int second)
{
dateData = (ulong) (DateToTicks(year, month, day) + TimeToTicks(hour, minute, second));
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, day, hour, minute, second, and Coordinated Universal Time (UTC) or local time.
/// </summary>
/// <param name="year">The year (1 through 9999). </param><param name="month">The month (1 through 12). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><param name="hour">The hours (0 through 23). </param><param name="minute">The minutes (0 through 59). </param><param name="second">The seconds (0 through 59). </param><param name="kind">One of the enumeration values that indicates whether <paramref name="year"/>, <paramref name="month"/>, <paramref name="day"/>, <paramref name="hour"/>, <paramref name="minute"/> and <paramref name="second"/> specify a local time, Coordinated Universal Time (UTC), or neither.</param><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is less than 1 or greater than 9999. -or- <paramref name="month"/> is less than 1 or greater than 12. -or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>.-or- <paramref name="hour"/> is less than 0 or greater than 23. -or- <paramref name="minute"/> is less than 0 or greater than 59. -or- <paramref name="second"/> is less than 0 or greater than 59. </exception><exception cref="T:System.ArgumentException">The specified time parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. -or-<paramref name="kind"/> is not one of the <see cref="T:System.DateTimeKind"/> values.</exception>
public DateTime(int year, int month, int day, int hour, int minute, int second, DateTimeKind kind)
{
if (kind < DateTimeKind.Unspecified || kind > DateTimeKind.Local)
throw new ArgumentException("kind");
dateData = (ulong) (DateToTicks(year, month, day) + TimeToTicks(hour, minute, second) | (long) kind << 62);
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, day, hour, minute, and second for the specified calendar.
/// </summary>
/// <param name="year">The year (1 through the number of years in <paramref name="calendar"/>). </param><param name="month">The month (1 through the number of months in <paramref name="calendar"/>). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><param name="hour">The hours (0 through 23). </param><param name="minute">The minutes (0 through 59). </param><param name="second">The seconds (0 through 59). </param><param name="calendar">The calendar that is used to interpret <paramref name="year"/>, <paramref name="month"/>, and <paramref name="day"/>. </param><exception cref="T:System.ArgumentNullException"><paramref name="calendar"/> is null. </exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is not in the range supported by <paramref name="calendar"/>.-or- <paramref name="month"/> is less than 1 or greater than the number of months in <paramref name="calendar"/>.-or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>.-or- <paramref name="hour"/> is less than 0 or greater than 23 -or- <paramref name="minute"/> is less than 0 or greater than 59. -or- <paramref name="second"/> is less than 0 or greater than 59. </exception><exception cref="T:System.ArgumentException">The specified parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. </exception>
public DateTime(int year, int month, int day, int hour, int minute, int second, Calendar calendar)
{
if (calendar == null)
throw new ArgumentNullException("calendar");
dateData = (ulong) calendar.ToDateTime(year, month, day, hour, minute, second, 0).Ticks;
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, day, hour, minute, second, and millisecond.
/// </summary>
/// <param name="year">The year (1 through 9999). </param><param name="month">The month (1 through 12). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><param name="hour">The hours (0 through 23). </param><param name="minute">The minutes (0 through 59). </param><param name="second">The seconds (0 through 59). </param><param name="millisecond">The milliseconds (0 through 999). </param><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is less than 1 or greater than 9999.-or- <paramref name="month"/> is less than 1 or greater than 12.-or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>.-or- <paramref name="hour"/> is less than 0 or greater than 23.-or- <paramref name="minute"/> is less than 0 or greater than 59.-or- <paramref name="second"/> is less than 0 or greater than 59.-or- <paramref name="millisecond"/> is less than 0 or greater than 999. </exception><exception cref="T:System.ArgumentException">The specified parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. </exception>
public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond)
{
if (millisecond < 0 || millisecond >= 1000)
{
throw new ArgumentOutOfRangeException("millisecond");
}
else
{
long num = DateToTicks(year, month, day) + TimeToTicks(hour, minute, second) + millisecond*10000L;
if (num < 0L || num > 3155378975999999999L)
throw new ArgumentException();
dateData = (ulong) num;
}
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, day, hour, minute, second, millisecond, and Coordinated Universal Time (UTC) or local time.
/// </summary>
/// <param name="year">The year (1 through 9999). </param><param name="month">The month (1 through 12). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><param name="hour">The hours (0 through 23). </param><param name="minute">The minutes (0 through 59). </param><param name="second">The seconds (0 through 59). </param><param name="millisecond">The milliseconds (0 through 999). </param><param name="kind">One of the enumeration values that indicates whether <paramref name="year"/>, <paramref name="month"/>, <paramref name="day"/>, <paramref name="hour"/>, <paramref name="minute"/>, <paramref name="second"/>, and <paramref name="millisecond"/> specify a local time, Coordinated Universal Time (UTC), or neither.</param><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is less than 1 or greater than 9999.-or- <paramref name="month"/> is less than 1 or greater than 12.-or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>.-or- <paramref name="hour"/> is less than 0 or greater than 23.-or- <paramref name="minute"/> is less than 0 or greater than 59.-or- <paramref name="second"/> is less than 0 or greater than 59.-or- <paramref name="millisecond"/> is less than 0 or greater than 999. </exception><exception cref="T:System.ArgumentException">The specified time parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. -or-<paramref name="kind"/> is not one of the <see cref="T:System.DateTimeKind"/> values.</exception>
public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond,
DateTimeKind kind)
{
if (millisecond < 0 || millisecond >= 1000)
{
throw new ArgumentOutOfRangeException("millisecond");
}
else
{
if (kind < DateTimeKind.Unspecified || kind > DateTimeKind.Local)
throw new ArgumentException("kind");
long num = DateToTicks(year, month, day) + TimeToTicks(hour, minute, second) + millisecond*10000L;
if (num < 0L || num > 3155378975999999999L)
throw new ArgumentException();
dateData = (ulong) (num | (long) kind << 62);
}
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, day, hour, minute, second, and millisecond for the specified calendar.
/// </summary>
/// <param name="year">The year (1 through the number of years in <paramref name="calendar"/>). </param><param name="month">The month (1 through the number of months in <paramref name="calendar"/>). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><param name="hour">The hours (0 through 23). </param><param name="minute">The minutes (0 through 59). </param><param name="second">The seconds (0 through 59). </param><param name="millisecond">The milliseconds (0 through 999). </param><param name="calendar">The calendar that is used to interpret <paramref name="year"/>, <paramref name="month"/>, and <paramref name="day"/>.</param><exception cref="T:System.ArgumentNullException"><paramref name="calendar"/> is null. </exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is not in the range supported by <paramref name="calendar"/>.-or- <paramref name="month"/> is less than 1 or greater than the number of months in <paramref name="calendar"/>.-or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>.-or- <paramref name="hour"/> is less than 0 or greater than 23.-or- <paramref name="minute"/> is less than 0 or greater than 59.-or- <paramref name="second"/> is less than 0 or greater than 59.-or- <paramref name="millisecond"/> is less than 0 or greater than 999. </exception><exception cref="T:System.ArgumentException">The specified parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. </exception>
public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond,
Calendar calendar)
{
if (calendar == null)
throw new ArgumentNullException("calendar");
if (millisecond < 0 || millisecond >= 1000)
{
throw new ArgumentOutOfRangeException("millisecond");
}
else
{
long num = calendar.ToDateTime(year, month, day, hour, minute, second, 0).Ticks + millisecond*10000L;
if (num < 0L || num > 3155378975999999999L)
throw new ArgumentException();
dateData = (ulong) num;
}
}
/// <summary>
/// Initializes a new instance of the <see cref="T:System.DateTime"/> structure to the specified year, month, day, hour, minute, second, millisecond, and Coordinated Universal Time (UTC) or local time for the specified calendar.
/// </summary>
/// <param name="year">The year (1 through the number of years in <paramref name="calendar"/>). </param><param name="month">The month (1 through the number of months in <paramref name="calendar"/>). </param><param name="day">The day (1 through the number of days in <paramref name="month"/>). </param><param name="hour">The hours (0 through 23). </param><param name="minute">The minutes (0 through 59). </param><param name="second">The seconds (0 through 59). </param><param name="millisecond">The milliseconds (0 through 999). </param><param name="calendar">The calendar that is used to interpret <paramref name="year"/>, <paramref name="month"/>, and <paramref name="day"/>.</param><param name="kind">One of the enumeration values that indicates whether <paramref name="year"/>, <paramref name="month"/>, <paramref name="day"/>, <paramref name="hour"/>, <paramref name="minute"/>, <paramref name="second"/>, and <paramref name="millisecond"/> specify a local time, Coordinated Universal Time (UTC), or neither.</param><exception cref="T:System.ArgumentNullException"><paramref name="calendar"/> is null. </exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="year"/> is not in the range supported by <paramref name="calendar"/>.-or- <paramref name="month"/> is less than 1 or greater than the number of months in <paramref name="calendar"/>.-or- <paramref name="day"/> is less than 1 or greater than the number of days in <paramref name="month"/>.-or- <paramref name="hour"/> is less than 0 or greater than 23.-or- <paramref name="minute"/> is less than 0 or greater than 59.-or- <paramref name="second"/> is less than 0 or greater than 59.-or- <paramref name="millisecond"/> is less than 0 or greater than 999. </exception><exception cref="T:System.ArgumentException">The specified time parameters evaluate to less than <see cref="F:System.DateTime.MinValue"/> or more than <see cref="F:System.DateTime.MaxValue"/>. -or-<paramref name="kind"/> is not one of the <see cref="T:System.DateTimeKind"/> values.</exception>
public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond,
Calendar calendar, DateTimeKind kind)
{
if (calendar == null)
throw new ArgumentNullException("calendar");
if (millisecond < 0 || millisecond >= 1000)
{
throw new ArgumentOutOfRangeException("millisecond");
}
else
{
if (kind < DateTimeKind.Unspecified || kind > DateTimeKind.Local)
throw new ArgumentException("kind");
long num = calendar.ToDateTime(year, month, day, hour, minute, second, 0).Ticks + millisecond*10000L;
if (num < 0L || num > 3155378975999999999L)
throw new ArgumentException();
dateData = (ulong) (num | (long) kind << 62);
}
}
private DateTime(SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new ArgumentNullException("info");
bool flag1 = false;
bool flag2 = false;
long num1 = 0L;
ulong num2 = 0UL;
SerializationInfoEnumerator enumerator = info.GetEnumerator();
while (enumerator.MoveNext())
{
switch (enumerator.Name)
{
case "ticks":
num1 = Convert.ToInt64(enumerator.Value, CultureInfo.InvariantCulture);
flag1 = true;
continue;
case "dateData":
num2 = Convert.ToUInt64(enumerator.Value, CultureInfo.InvariantCulture);
flag2 = true;
continue;
default:
continue;
}
}
if (flag2)
{
dateData = num2;
}
else
{
if (!flag1)
throw new SerializationException();
dateData = (ulong) num1;
}
long internalTicks = InternalTicks;
if (internalTicks < 0L || internalTicks > 3155378975999999999L)
throw new SerializationException();
}
/// <summary>
/// Adds a specified time interval to a specified date and time, yielding a new date and time.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> that is the sum of the values of <paramref name="d"/> and <paramref name="t"/>.
/// </returns>
/// <param name="d">A <see cref="T:System.DateTime"/>. </param><param name="t">A <see cref="T:System.TimeSpan"/>. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><filterpriority>3</filterpriority>
public static DateTime operator +(DateTime d, TimeSpan t)
{
long internalTicks = d.InternalTicks;
long num = t.Ticks;
if (num > 3155378975999999999L - internalTicks || num < -internalTicks)
throw new ArgumentOutOfRangeException("t");
else
return new DateTime((ulong) (internalTicks + num) | d.InternalKind);
}
/// <summary>
/// Subtracts a specified time interval from a specified date and time and returns a new date and time.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the value of <paramref name="d"/> minus the value of <paramref name="t"/>.
/// </returns>
/// <param name="d">A <see cref="T:System.DateTime"/>. </param><param name="t">A <see cref="T:System.TimeSpan"/>. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><filterpriority>3</filterpriority>
public static DateTime operator -(DateTime d, TimeSpan t)
{
long internalTicks = d.InternalTicks;
long num = t.Ticks;
if (internalTicks < num || internalTicks - 3155378975999999999L > num)
throw new ArgumentOutOfRangeException("t");
else
return new DateTime((ulong) (internalTicks - num) | d.InternalKind);
}
/// <summary>
/// Subtracts a specified date and time from another specified date and time and returns a time interval.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.TimeSpan"/> that is the time interval between <paramref name="d1"/> and <paramref name="d2"/>; that is, <paramref name="d1"/> minus <paramref name="d2"/>.
/// </returns>
/// <param name="d1">A <see cref="T:System.DateTime"/> (the minuend). </param><param name="d2">A <see cref="T:System.DateTime"/> (the subtrahend). </param><filterpriority>3</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static TimeSpan operator -(DateTime d1, DateTime d2)
{
return new TimeSpan(d1.InternalTicks - d2.InternalTicks);
}
/// <summary>
/// Determines whether two specified instances of <see cref="T:System.DateTime"/> are equal.
/// </summary>
///
/// <returns>
/// true if <paramref name="d1"/> and <paramref name="d2"/> represent the same date and time; otherwise, false.
/// </returns>
/// <param name="d1">A <see cref="T:System.DateTime"/>. </param><param name="d2">A <see cref="T:System.DateTime"/>. </param><filterpriority>3</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator ==(DateTime d1, DateTime d2)
{
return d1.InternalTicks == d2.InternalTicks;
}
/// <summary>
/// Determines whether two specified instances of <see cref="T:System.DateTime"/> are not equal.
/// </summary>
///
/// <returns>
/// true if <paramref name="d1"/> and <paramref name="d2"/> do not represent the same date and time; otherwise, false.
/// </returns>
/// <param name="d1">A <see cref="T:System.DateTime"/>. </param><param name="d2">A <see cref="T:System.DateTime"/>. </param><filterpriority>3</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator !=(DateTime d1, DateTime d2)
{
return d1.InternalTicks != d2.InternalTicks;
}
/// <summary>
/// Determines whether one specified <see cref="T:System.DateTime"/> is less than another specified <see cref="T:System.DateTime"/>.
/// </summary>
///
/// <returns>
/// true if <paramref name="t1"/> is less than <paramref name="t2"/>; otherwise, false.
/// </returns>
/// <param name="t1">A <see cref="T:System.DateTime"/>. </param><param name="t2">A <see cref="T:System.DateTime"/>. </param><filterpriority>3</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator <(DateTime t1, DateTime t2)
{
return t1.InternalTicks < t2.InternalTicks;
}
/// <summary>
/// Determines whether one specified <see cref="T:System.DateTime"/> is less than or equal to another specified <see cref="T:System.DateTime"/>.
/// </summary>
///
/// <returns>
/// true if <paramref name="t1"/> is less than or equal to <paramref name="t2"/>; otherwise, false.
/// </returns>
/// <param name="t1">A <see cref="T:System.DateTime"/>. </param><param name="t2">A <see cref="T:System.DateTime"/>. </param><filterpriority>3</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator <=(DateTime t1, DateTime t2)
{
return t1.InternalTicks <= t2.InternalTicks;
}
/// <summary>
/// Determines whether one specified <see cref="T:System.DateTime"/> is greater than another specified <see cref="T:System.DateTime"/>.
/// </summary>
///
/// <returns>
/// true if <paramref name="t1"/> is greater than <paramref name="t2"/>; otherwise, false.
/// </returns>
/// <param name="t1">A <see cref="T:System.DateTime"/>. </param><param name="t2">A <see cref="T:System.DateTime"/>. </param><filterpriority>3</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator >(DateTime t1, DateTime t2)
{
return t1.InternalTicks > t2.InternalTicks;
}
/// <summary>
/// Determines whether one specified <see cref="T:System.DateTime"/> is greater than or equal to another specified <see cref="T:System.DateTime"/>.
/// </summary>
///
/// <returns>
/// true if <paramref name="t1"/> is greater than or equal to <paramref name="t2"/>; otherwise, false.
/// </returns>
/// <param name="t1">A <see cref="T:System.DateTime"/>. </param><param name="t2">A <see cref="T:System.DateTime"/>. </param><filterpriority>3</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator >=(DateTime t1, DateTime t2)
{
return t1.InternalTicks >= t2.InternalTicks;
}
/// <summary>
/// Returns a new <see cref="T:System.DateTime"/> that adds the value of the specified <see cref="T:System.TimeSpan"/> to the value of this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the sum of the date and time represented by this instance and the time interval represented by <paramref name="value"/>.
/// </returns>
/// <param name="value">A <see cref="T:System.TimeSpan"/> object that represents a positive or negative time interval. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><filterpriority>2</filterpriority>
public DateTime Add(TimeSpan value)
{
return AddTicks(value.Ticks);
}
private DateTime Add(double value, int scale)
{
var num = (long) (value*scale + (value >= 0.0 ? 0.5 : -0.5));
if (num <= -315537897600000L || num >= 315537897600000L)
throw new ArgumentOutOfRangeException("value");
else
return AddTicks(num*10000L);
}
/// <summary>
/// Returns a new <see cref="T:System.DateTime"/> that adds the specified number of days to the value of this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the sum of the date and time represented by this instance and the number of days represented by <paramref name="value"/>.
/// </returns>
/// <param name="value">A number of whole and fractional days. The <paramref name="value"/> parameter can be negative or positive. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><filterpriority>2</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public DateTime AddDays(double value)
{
return Add(value, 86400000);
}
/// <summary>
/// Returns a new <see cref="T:System.DateTime"/> that adds the specified number of hours to the value of this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the sum of the date and time represented by this instance and the number of hours represented by <paramref name="value"/>.
/// </returns>
/// <param name="value">A number of whole and fractional hours. The <paramref name="value"/> parameter can be negative or positive. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><filterpriority>2</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public DateTime AddHours(double value)
{
return Add(value, 3600000);
}
/// <summary>
/// Returns a new <see cref="T:System.DateTime"/> that adds the specified number of milliseconds to the value of this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the sum of the date and time represented by this instance and the number of milliseconds represented by <paramref name="value"/>.
/// </returns>
/// <param name="value">A number of whole and fractional milliseconds. The <paramref name="value"/> parameter can be negative or positive. Note that this value is rounded to the nearest integer.</param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><filterpriority>2</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public DateTime AddMilliseconds(double value)
{
return Add(value, 1);
}
/// <summary>
/// Returns a new <see cref="T:System.DateTime"/> that adds the specified number of minutes to the value of this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the sum of the date and time represented by this instance and the number of minutes represented by <paramref name="value"/>.
/// </returns>
/// <param name="value">A number of whole and fractional minutes. The <paramref name="value"/> parameter can be negative or positive. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><filterpriority>2</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public DateTime AddMinutes(double value)
{
return Add(value, 60000);
}
/// <summary>
/// Returns a new <see cref="T:System.DateTime"/> that adds the specified number of months to the value of this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the sum of the date and time represented by this instance and <paramref name="months"/>.
/// </returns>
/// <param name="months">A number of months. The <paramref name="months"/> parameter can be negative or positive. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>.-or- <paramref name="months"/> is less than -120,000 or greater than 120,000. </exception><filterpriority>2</filterpriority>
public DateTime AddMonths(int months)
{
if (months < -120000 || months > 120000)
throw new ArgumentOutOfRangeException("months");
int datePart1 = GetDatePart(0);
int datePart2 = GetDatePart(2);
int day = GetDatePart(3);
int num1 = datePart2 - 1 + months;
int month;
int year;
if (num1 >= 0)
{
month = num1%12 + 1;
year = datePart1 + num1/12;
}
else
{
month = 12 + (num1 + 1)%12;
year = datePart1 + (num1 - 11)/12;
}
if (year < 1 || year > 9999)
throw new ArgumentOutOfRangeException("months");
int num2 = DaysInMonth(year, month);
if (day > num2)
day = num2;
return new DateTime((ulong) (DateToTicks(year, month, day) + InternalTicks%864000000000L) | InternalKind);
}
/// <summary>
/// Returns a new <see cref="T:System.DateTime"/> that adds the specified number of seconds to the value of this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the sum of the date and time represented by this instance and the number of seconds represented by <paramref name="value"/>.
/// </returns>
/// <param name="value">A number of whole and fractional seconds. The <paramref name="value"/> parameter can be negative or positive. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cref="T:System.DateTime"/> is less than <see cref="F:System.DateTime.MinValue"/> or greater than <see cref="F:System.DateTime.MaxValue"/>. </exception><filterpriority>2</filterpriority>
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public DateTime AddSeconds(double value)
{
return Add(value, 1000);
}
/// <summary>
/// Returns a new <see cref="T:System.DateTime"/> that adds the specified number of ticks to the value of this instance.
/// </summary>
///
/// <returns>
/// A <see cref="T:System.DateTime"/> whose value is the sum of the date and time represented by this instance and the time represented by <paramref name="value"/>.
/// </returns>
/// <param name="value">A number of 100-nanosecond ticks. The <paramref name="value"/> parameter can be positive or negative. </param><exception cref="T:System.ArgumentOutOfRangeException">The resulting <see cre