DateTime 结构

2013/12/13

表示某个时刻,通常表示为日期加上一天中的某个具体时间。

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)

public struct DateTime : IComparable, IComparable<DateTime>, 
	IConvertible, IEquatable<DateTime>, IFormattable

DateTime 类型公开以下成员。

  名称说明
公共方法DateTime(Int64)DateTime 结构的新实例初始化为指定的刻度数。
公共方法DateTime(Int64, DateTimeKind)DateTime 结构的新实例初始化为指定的计时周期数以及协调世界时 (UTC) 或本地时间。
公共方法DateTime(Int32, Int32, Int32)DateTime 结构的新实例初始化为指定的年、月和日。
公共方法DateTime(Int32, Int32, Int32, Calendar)DateTime 结构的新实例初始化为指定日历的指定年、月和日。
公共方法DateTime(Int32, Int32, Int32, Int32, Int32, Int32)DateTime 结构的新实例初始化为指定的年、月、日、小时、分钟和秒。
公共方法DateTime(Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)DateTime 结构的新实例初始化为指定年、月、日、小时、分钟、秒和协调世界时 (UTC) 或本地时间。
公共方法DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Calendar)DateTime 结构的新实例初始化为指定日历的指定年、月、日、小时、分钟和秒。
公共方法DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32)DateTime 结构的新实例初始化为指定的年、月、日、小时、分钟、秒和毫秒。
公共方法DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)DateTime 结构的新实例初始化为指定年、月、日、小时、分钟、秒、毫秒和协调世界时 (UTC) 或本地时间。
公共方法DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar)DateTime 结构的新实例初始化为指定日历的指定年、月、日、小时、分钟、秒和毫秒。
公共方法DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar, DateTimeKind)DateTime 结构的新实例初始化为指定日历的指定年、月、日、小时、分钟、秒、毫秒和协调世界时 (UTC) 或本地时间。
返回顶部

  名称说明
公共属性Date获取此实例的日期分量。
公共属性Day获取此实例所表示的日期为该月中的第几天。
公共属性DayOfWeek获取此实例所表示的日期是星期几。
公共属性DayOfYear获取此实例所表示的日期是该年中的第几天。
公共属性Hour获取此实例所表示日期的小时部分。
公共属性Kind获取一个值,该值指示由此实例表示的时间是基于本地时间、协调世界时 (UTC),还是两者皆否。
公共属性Millisecond获取此实例所表示日期的毫秒部分。
公共属性Minute获取此实例所表示日期的分钟部分。
公共属性Month获取此实例所表示日期的月份部分。
公共属性静态成员Now获取一个 DateTime 对象,该对象设置为此计算机上的当前日期和时间,表示为本地时间。
公共属性Second获取此实例所表示日期的秒部分。
公共属性Ticks获取表示此实例的日期和时间的计时周期数。
公共属性TimeOfDay获取此实例的当天的时间。
公共属性静态成员Today获取当前日期。
公共属性静态成员UtcNow获取一个 DateTime 对象,该对象设置为此计算机上的当前日期和时间,表示为协调通用时间 (UTC)。
公共属性Year获取此实例所表示日期的年份部分。
返回顶部

  名称说明
公共方法Add返回一个新的 DateTime,它将指定 TimeSpan 的值加到此实例的值上。
公共方法AddDays返回一个新的 DateTime,它将指定的天数加到此实例的值上。
公共方法AddHours返回一个新的 DateTime,它将指定的小时数加到此实例的值上。
公共方法AddMilliseconds返回一个新的 DateTime,它将指定的毫秒数加到此实例的值上。
公共方法AddMinutes返回一个新的 DateTime,它将指定的分钟数加到此实例的值上。
公共方法AddMonths返回一个新的 DateTime,它将指定的月数加到此实例的值上。
公共方法AddSeconds返回一个新的 DateTime,它将指定的秒数加到此实例的值上。
公共方法AddTicks返回一个新的 DateTime,它将指定的计时周期数加到此实例的值上。
公共方法AddYears返回一个新的 DateTime,它将指定的年份数加到此实例的值上。
公共方法静态成员Compare对两个 DateTime 的实例进行比较,并返回一个指示第一个 DateTime 实例是早于、等于还是晚于第二个 DateTime 实例的整数。
公共方法CompareTo(DateTime)将此实例的值与指定的 DateTime 值相比较,并返回一个整数,该整数指示此实例是早于、等于还是晚于指定的 DateTime 值。
公共方法CompareTo(Object)将此实例的值与包含指定的 DateTime 值的指定对象相比较,并返回一个整数,该整数指示此实例是早于、等于还是晚于指定的 DateTime 值。
公共方法静态成员DaysInMonth返回指定年和月中的天数。
公共方法Equals(DateTime)返回一个值,该值指示此实例的值是否与指定的 DateTime 实例的值相等。
公共方法Equals(Object)返回一个值,该值指示此实例是否等于指定的对象。 (重写 ValueType.Equals(Object)。)
公共方法静态成员Equals(DateTime, DateTime)返回一个值,该值指示两个 DateTime 实例是否具有相同的日期和时间值。
受保护的方法Finalize允许 Object 在垃圾回收器回收该对象之前尝试释放资源并执行其他清理操作。 (从 Object 继承。)
公共方法静态成员FromBinary反序列化一个 64 位二进制值,并重新创建序列化的 DateTime 初始对象。
公共方法静态成员FromFileTime将指定的 Windows 文件时间转换为等效的本地时间。
公共方法静态成员FromFileTimeUtc将指定的 Windows 文件时间转换为等效的 UTC 时间。
公共方法静态成员FromOADate返回与指定的 OLE 自动化日期等效的 DateTime
公共方法GetDateTimeFormats()将此实例的值转换为标准日期和时间格式说明符支持的所有字符串表示形式。
公共方法GetDateTimeFormats(Char)将此实例的值转换为指定的标准日期和时间格式说明符支持的所有字符串表示形式。
公共方法GetDateTimeFormats(IFormatProvider)将此实例的值转换为标准日期和时间格式说明符和指定的区域性特定格式信息支持的所有字符串表示形式。
公共方法GetDateTimeFormats(Char, IFormatProvider)将此实例的值转换为指定的标准日期和时间格式说明符和区域性特定格式信息支持的所有字符串表示形式。
公共方法GetHashCode返回此实例的哈希代码。 (重写 ValueType.GetHashCode()。)
公共方法GetType获取当前实例的 Type (从 Object 继承。)
公共方法GetTypeCode返回值类型 DateTimeTypeCode
公共方法IsDaylightSavingTime指示此 DateTime 实例是否在当前时区的夏时制范围内。
公共方法静态成员IsLeapYear返回指定的年份是否为闰年的指示。
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (从 Object 继承。)
公共方法静态成员Parse(String)将日期和时间的指定字符串表示形式转换为其等效的 DateTime
公共方法静态成员Parse(String, IFormatProvider)使用指定的区域性特定格式信息,将日期和时间的指定字符串表示形式转换为其等效的 DateTime
公共方法静态成员Parse(String, IFormatProvider, DateTimeStyles)使用指定的区域性特定格式信息和格式设置样式将日期和时间的指定字符串表示形式转换为其等效的 DateTime
公共方法静态成员ParseExact(String, String, IFormatProvider)使用指定的区域性特定格式信息,将日期和时间的指定字符串表示形式转换为其等效的 DateTime。字符串表示形式的格式必须与指定的格式完全匹配。
公共方法静态成员ParseExact(String, String, IFormatProvider, DateTimeStyles)使用指定的格式、区域性特定格式信息和样式将日期和时间的指定字符串表示形式转换为其等效的 DateTime。字符串表示形式的格式必须与指定的格式完全匹配,否则会引发异常。
公共方法静态成员ParseExact(String, String[], IFormatProvider, DateTimeStyles)使用指定的格式数组、区域性特定格式信息和样式将日期和时间的指定字符串表示形式转换为其等效的 DateTime。字符串表示形式的格式必须至少与指定的格式之一完全匹配,否则会引发异常。
公共方法静态成员SpecifyKind创建新的 DateTime 对象,该对象具有与指定的 DateTime 相同的刻度数,但是根据指定的 DateTimeKind 值的指示,指定为本地时间或协调世界时 (UTC),或者两者皆否。
公共方法Subtract(DateTime)从此实例中减去指定的日期和时间。
公共方法Subtract(TimeSpan)从此实例中减去指定持续时间。
公共方法ToBinary将当前 DateTime 对象序列化为一个 64 位二进制值,该值随后可用于重新创建 DateTime 对象。
公共方法ToFileTime将当前 DateTime 对象的值转换为 Windows 文件时间。
公共方法ToFileTimeUtc将当前 DateTime 对象的值转换为 Windows 文件时间。
公共方法ToLocalTime将当前 DateTime 对象的值转换为本地时间。
公共方法ToLongDateString将当前 DateTime 对象的值转换为其等效的长日期字符串表示形式。
公共方法ToLongTimeString将当前 DateTime 对象的值转换为其等效的长时间字符串表示形式。
公共方法ToOADate将此实例的值转换为等效的 OLE 自动化日期。
公共方法ToShortDateString将当前 DateTime 对象的值转换为其等效的短日期字符串表示形式。
公共方法ToShortTimeString将当前 DateTime 对象的值转换为其等效的短时间字符串表示形式。
公共方法ToString()将当前 DateTime 对象的值转换为其等效的字符串表示形式。 (重写 ValueType.ToString()。)
公共方法ToString(IFormatProvider)使用指定的区域性特定格式信息将当前 DateTime 对象的值转换为它的等效字符串表示形式。
公共方法ToString(String)使用指定的格式将当前 DateTime 对象的值转换为它的等效字符串表示形式。
公共方法ToString(String, IFormatProvider)使用指定的格式和区域性特定格式信息将当前 DateTime 对象的值转换为它的等效字符串表示形式。
公共方法ToUniversalTime将当前 DateTime 对象的值转换为协调世界时 (UTC)。
公共方法静态成员TryParse(String, DateTime)将日期和时间的指定字符串表示形式转换为其 DateTime 等效项,并返回一个指示转换是否成功的值。
公共方法静态成员TryParse(String, IFormatProvider, DateTimeStyles, DateTime)使用指定的区域性特定格式信息和格式设置样式,将日期和时间的指定字符串表示形式转换为其 DateTime 等效项,并返回一个指示转换是否成功的值。
公共方法静态成员TryParseExact(String, String, IFormatProvider, DateTimeStyles, DateTime)使用指定的格式、区域性特定格式信息和样式将日期和时间的指定字符串表示形式转换为其等效的 DateTime。字符串表示形式的格式必须与指定的格式完全匹配。该方法返回一个指示转换是否成功的值。
公共方法静态成员TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime)使用指定的格式数组、区域性特定格式信息和样式将日期和时间的指定字符串表示形式转换为其等效的 DateTime。字符串表示形式的格式必须至少与指定的格式之一完全匹配。该方法返回一个指示转换是否成功的值。
返回顶部

  名称说明
公共运算符静态成员Addition将指定的时间间隔加到指定的日期和时间以生成新的日期和时间。
公共运算符静态成员Equality确定 DateTime 的两个指定的实例是否相等。
公共运算符静态成员GreaterThan确定指定的 DateTime 是否大于另一个指定的 DateTime
公共运算符静态成员GreaterThanOrEqual确定指定的 DateTime 是否大于等于另一个指定的 DateTime
公共运算符静态成员Inequality确定 DateTime 的两个指定的实例是否不等。
公共运算符静态成员LessThan确定指定的 DateTime 是否小于另一个指定的 DateTime
公共运算符静态成员LessThanOrEqual确定指定的 DateTime 是否小于或等于另一个指定的 DateTime
公共运算符静态成员Subtraction(DateTime, DateTime)将指定的日期和时间与另一个指定的日期和时间相减,返回一个时间间隔。
公共运算符静态成员Subtraction(DateTime, TimeSpan)从指定的日期和时间减去指定的时间间隔,返回新的日期和时间。
返回顶部

  名称说明
公共字段静态成员MaxValue表示 DateTime 的最大可能值。此字段为只读。
公共字段静态成员MinValue表示 DateTime 的最小可能值。此字段为只读。
返回顶部

  名称说明
显式接口实现私有方法IConvertible.ToBoolean基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToByte基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToChar基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToDateTime基础结构。 返回当前 DateTime 对象。
显式接口实现私有方法IConvertible.ToDecimal基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToDouble基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToInt16基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToInt32基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToInt64基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToSByte基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToSingle基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToType基础结构。 将当前的 DateTime 对象转换为指定类型的对象。
显式接口实现私有方法IConvertible.ToUInt16基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToUInt32基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
显式接口实现私有方法IConvertible.ToUInt64基础结构。 不支持此转换。尝试使用此方法将引发 InvalidCastException
返回顶部

DateTime 值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和

时间值以 100 纳秒为单位(该单位称为计时周期)进行计量,在 GregorianCalendar 日历中,特定日期为自公元 0001 年 1 月 1 日午夜 12:00 始的计时周期数(不包括将通过闰秒添加的计时周期)。

. 例如,计时周期值 31241376000000000L 表示 0100 年 1 月 1 日(星期五)午夜 12:00:00。DateTime 值始终在显式或默认日历的上下文中表示。

说明注意:

如果您正在处理一个您需要将转换为其他时间间隔(如分钟或秒)的计时周期值,您应该使用 TimeSpan.TicksPerDayTimeSpan.TicksPerHourTimeSpan.TicksPerMinuteTimeSpan.TicksPerSecondTimeSpan.TicksPerMillisecond 常量来执行转换。例如,如要将用指定的刻度数表示的秒数与 DateTime 值的 Second 分量相加,您可以使用表达式 dateValue.Second + nTicks/TimeSpan.TicksPerSecond

DateTime 结构包含一个由私有字段 Kind 和 Ticks 字段串联组成的 64 位字段。Kind 字段是一个 2 位字段,它指示 DateTime 结构是表示本地时间、协调世界时 (UTC) 还是未指定时区中的时间。Kind 字段用于执行时区之间的时间转换,但不用于时间的比较或算术运算。Kind 字段的值可通过 Kind 属性获取。

说明注意:

DateTime 结构用于处理有一定时区识别能力的日期和时间值,它的一种替代结构是 DateTimeOffset 结构。DateTimeOffset 结构将日期和时间信息存储在私有 DateTime 字段中,并将该日期和时间与 UTC 相差的分钟数存储在私有 Int16 字段中。这使得 DateTimeOffset 值可以反映特定时区中的时间,而 DateTime 值只能明确反映 UTC 时间和本地时区的时间。

实例化 DateTime 对象

可以通过以下任一方式创建新的 DateTime 值:

  • 调用 DateTime 构造函数的任意重载,该构造函数用于指定日期和时间值的特定元素(例如,年、月、日或计时周期数)。下面的语句演示如何调用某一 DateTime 构造函数来创建具有特定年、月、日、小时、分钟和秒的日期。

    
    DateTime date1 = new DateTime(2008, 5, 1, 8, 30, 52);
    
    
    
  • 使用任何编译器特定的语法声明日期和时间值。例如,下面的 Visual Basic 语句初始化一个新的 DateTime 值。

    
    Dim date1 As Date = #5/1/2008 8:30:52 AM#
    
    
    
  • DateTime 对象分配属性或方法所返回的日期和时间值。下面的示例将当前日期和时间、当前协调世界时 (UTC) 日期和时间以及当前日期分别分配给三个新的 DateTime 变量。

    
    DateTime date1 = DateTime.Now;
    DateTime date2 = DateTime.UtcNow;
    DateTime date3 = DateTime.Today;
    
    
    
  • 分析日期和时间值的字符串表示形式。ParseParseExactTryParseTryParseExact 方法均可将字符串转换为其等效的日期和时间值。下面的示例使用 Parse 方法分析字符串并将其转换为 DateTime 值。

    ParseExactTryParseTryParseExact 方法均可将字符串转换为其等效的日期和时间值。下面的示例使用 Parse 方法分析字符串并将其转换为 DateTime 值。

    
    string dateString = "5/1/2008 8:30:52 AM";
    DateTime date1 = DateTime.Parse(dateString, 
                              System.Globalization.CultureInfo.InvariantCulture);
    
    
    

    请注意,TryParseTryParseExact 方法在尝试转换一个特定字符串的同时指示该字符串是否包含 DateTime 值的有效表示形式。

  • 调用 DateTime 结构的隐式默认构造函数。近似等效项(对于支持它的编译器)声明 DateTime 值,而不为其显式分配日期和时间。下面的示例以 C# 和 Visual Basic 演示对 DateTime 隐式默认构造函数的调用,并以 Visual Basic 演示不分配值的 DateTime 变量声明。

    
    DateTime dat1 = new DateTime();
    // The following method call displays 1/1/0001 12:00:00 AM.
    outputBlock.Text += dat1.ToString(System.Globalization.CultureInfo.InvariantCulture) + "\n";
    // The following method call displays True.
    outputBlock.Text += dat1.Equals(DateTime.MinValue) + "\n";
    
    
    

DateTime 值及其字符串表示形式

在内部,所有 DateTime 值均表示为自 0001 年 1 月 1 日午夜 12:00:00 以来经过的计时周期数(以 100 纳秒为间隔的间隔数)。实际的 DateTime 值与该值的字符串表示形式或它在用户界面元素中的外观无关。DateTime 值的外观是格式设置操作的结果。格式设置是将值转换为其字符串表示形式的过程。

由于日期和时间值的外观取决于区域性、国际标准、应用程序要求及个人偏好等因素,因此 DateTime 结构通过其 ToString 方法的重载在日期和时间值的格式设置方面提供了高度的灵活性。默认的 DateTime.ToString() 方法使用当前区域性的短日期和长时间模式返回日期和时间值的字符串表示形式。下面的示例使用默认的 DateTime.ToString() 方法来显示使用 en-US 区域性(即运行此示例的计算机上的当前区域性)的短日期和长时间模式的日期和时间。


DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
outputBlock.Text += date1.ToString() + "\n";
// For en-US culture, displays 3/1/2008 7:00:00 AM


DateTime.ToString(IFormatProvider) 方法使用特定区域性的短日期和长时间模式返回日期和时间值的字符串表示形式。下面的示例使用 DateTime.ToString(IFormatProvider) 方法来显示使用 fr-FR 区域性的短日期和长时间模式的日期和时间。


DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
outputBlock.Text += date1.ToString(new System.Globalization.CultureInfo("fr-FR")) + "\n";
// Displays 01/03/2008 07:00:00


DateTime.ToString(String) 方法使用当前区域性的格式设置约定,以标准或自定义格式说明符所定义的格式返回日期和时间的字符串表示形式。下面的示例使用 DateTime.ToString(String) 方法来显示 en-US 区域性(即运行此示例的计算机上的当前区域性)的完整日期和时间模式。


DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
outputBlock.Text += date1.ToString("F") + "\n";
// Displays Saturday, March 01, 2008 7:00:00 AM


DateTime.ToString(String, IFormatProvider) 方法使用特定区域性的格式设置约定,以特定格式说明符所定义的格式返回日期和时间的字符串表示形式。下面的示例使用 DateTime.ToString(String, IFormatProvider) 方法显示使用 fr-FR 区域性的完整日期和时间模式。


DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
outputBlock.Text += date1.ToString("F", new System.Globalization.CultureInfo("fr-FR")) + "\n";
// Displays samedi 1 mars 2008 07:00:00


DateTime 值

DateTime 类型的时间值描述通常使用协调世界时 (UTC) 标准来表达,它是格林尼治标准时间 (GMT) 的国际识别名。协调世界时是在经度零度(即 UTC 原点)测量到的时间。夏时制不适用于 UTC。

本地时间是相对于特定时区而言。时区与时区偏移量关联,它是时区从 UTC 原点算起的以小时为单位的偏移量。此外,本地时间有可能受夏时制影响,夏时制会对日长增加或减少一小时。因此,本地时间的计算是将时区偏移量加上 UTC,如有必要,再根据夏时制进行调整。UTC 原点的时区偏移量为零。

UTC 时间适合于计算、比较日期和时间,以及将日期和时间存储在文件中。本地时间适合于在桌面应用程序的用户界面中显示。识别时区的应用程序(如许多 Web 应用程序)还需要使用许多其他时区。

如果 DateTime 对象的 Kind 属性为 DateTimeKind.Unspecified,则其未指定表示的时间是本地时间、UTC 时间还是某个其他时区中的时间。

DateTime 运算

使用 DateTime 结构的计算(如 AddSubtract)不会修改该结构的值。相反,计算会返回新的 DateTime 结构,其值为计算结果。

说明注意:

DateTime 对象的计算和比较仅当这些对象表示同一时区中的时间时才有意义。

时区之间(例如,UTC 和本地时间之间,或者一个时区中的时间和本地时间之间)的转换运算会考虑本地时区的夏时制,但是算术和比较运算不考虑。

DateTime 结构本身不太支持从一个时区转换至另一个时区。您可以使用 ToLocalTime 方法将 UTC 转换为本地时间,也可以使用 ToUniversalTime 方法从本地时间转换为 UTC。但是,整套的时区转换方法是在 TimeZoneInfo 类中提供的。使用这些方法,可以将世界上任一时区中的时间转换为 UTC 或者本地时间。

每个 DateTime 成员都隐式使用公历执行其操作,例外是指定日历的构造函数以及使用从 IFormatProvider 派生的参数(如 System.Globalization.DateTimeFormatInfo)的方法,该参数隐式指定日历。

DateTime 类型中的成员所执行的运算会考虑闰年和月中天数等细节。

DateTime 与 TimeSpan

DateTime 值类型与 TimeSpan 值类型的差异在于 DateTime 表示时间上的一刻,而 TimeSpan 表示时间间隔。例如,这意味着将 DateTime 的一个实例与另一个实例相减可以获得表示这两个实例之间的时间间隔的 TimeSpan 对象。或者,将一个正 TimeSpan 与当前 DateTime 相加可以获得表示将来日期的 DateTime 值。

可以向 DateTime 对象增加或减少一个时间间隔。时间间隔可为负,也可为正,可以用计时周期或秒等为单位表示,也可表示为 TimeSpan 对象。

实现的接口

此类型实现 IComparableIComparable<T>IEquatable<T>IFormattableIConvertible 接口。使用 Convert 类进行转换,而不是使用此类型的 IConvertible 显式接口成员实现。

下面的示例演示如何比较大致等效的 DateTime 值,将它们声明为"相等"时接受很小的差异。有关如何编译和运行此示例代码的信息,请参见生成具有静态 Windows Phone TextBlock 控件的示例


using System;

class Example
{
   static bool RoughlyEquals(DateTime time, DateTime timeWithWindow, int windowInSeconds, int frequencyInSeconds)
   {

      long delta = (long)((TimeSpan)(timeWithWindow - time)).TotalSeconds % frequencyInSeconds;

      delta = delta > windowInSeconds ? frequencyInSeconds - delta : delta;

      return Math.Abs(delta) < windowInSeconds;
   }

   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      int window = 10;
      int freq = 60 * 60 * 2; // 2 hours;

      DateTime d1 = DateTime.Now;

      DateTime d2 = d1.AddSeconds(2 * window);
      DateTime d3 = d1.AddSeconds(-2 * window);
      DateTime d4 = d1.AddSeconds(window / 2);
      DateTime d5 = d1.AddSeconds(-window / 2);

      DateTime d6 = (d1.AddHours(2)).AddSeconds(2 * window);
      DateTime d7 = (d1.AddHours(2)).AddSeconds(-2 * window);
      DateTime d8 = (d1.AddHours(2)).AddSeconds(window / 2);
      DateTime d9 = (d1.AddHours(2)).AddSeconds(-window / 2);

      outputBlock.Text += String.Format("d1 ({0}) ~= d1 ({1}): {2}\n",
                          d1, d1, RoughlyEquals(d1, d1, window, freq));
      outputBlock.Text += String.Format("d1 ({0}) ~= d2 ({1}): {2}\n", 
                          d1, d2, RoughlyEquals(d1, d2, window, freq));
      outputBlock.Text += String.Format("d1 ({0}) ~= d3 ({1}): {2}\n", 
                          d1, d3, RoughlyEquals(d1, d3, window, freq));
      outputBlock.Text += String.Format("d1 ({0}) ~= d4 ({1}): {2}\n", 
                          d1, d4, RoughlyEquals(d1, d4, window, freq));
      outputBlock.Text += String.Format("d1 ({0}) ~= d5 ({1}): {2}\n", 
                          d1, d5, RoughlyEquals(d1, d5, window, freq));

      outputBlock.Text += String.Format("d1 ({0}) ~= d6 ({1}): {2}\n", 
                          d1, d6, RoughlyEquals(d1, d6, window, freq));
      outputBlock.Text += String.Format("d1 ({0}) ~= d7 ({1}): {2}\n", 
                          d1, d7, RoughlyEquals(d1, d7, window, freq));
      outputBlock.Text += String.Format("d1 ({0}) ~= d8 ({1}): {2}\n", 
                          d1, d8, RoughlyEquals(d1, d8, window, freq));
      outputBlock.Text += String.Format("d1 ({0}) ~= d9 ({1}): {2}\n", 
                          d1, d9, RoughlyEquals(d1, d9, window, freq));
   }
}
// The example displays output similar to the following:
//    d1 (1/28/2010 9:01:26 PM) ~= d1 (1/28/2010 9:01:26 PM): True
//    d1 (1/28/2010 9:01:26 PM) ~= d2 (1/28/2010 9:01:46 PM): False
//    d1 (1/28/2010 9:01:26 PM) ~= d3 (1/28/2010 9:01:06 PM): False
//    d1 (1/28/2010 9:01:26 PM) ~= d4 (1/28/2010 9:01:31 PM): True
//    d1 (1/28/2010 9:01:26 PM) ~= d5 (1/28/2010 9:01:21 PM): True
//    d1 (1/28/2010 9:01:26 PM) ~= d6 (1/28/2010 11:01:46 PM): False
//    d1 (1/28/2010 9:01:26 PM) ~= d7 (1/28/2010 11:01:06 PM): False
//    d1 (1/28/2010 9:01:26 PM) ~= d8 (1/28/2010 11:01:31 PM): True
//    d1 (1/28/2010 9:01:26 PM) ~= d9 (1/28/2010 11:01:21 PM): True


Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

此类型的所有成员都是线程安全的。看似修改了实例状态的成员实际上返回一个用新值初始化的新实例。正如对任何其他类型一样,对于包含此类型的实例的共享变量,也必须通过锁定来保护对其进行的读写,以保证实现线程安全。

警告说明警告:

在所有的硬件平台上都分配该类型的一个实例不是线程安全的,因为该实例的二进制表示形式可能太大,无法在单个原子操作中分配。

显示:
© 2014 Microsoft