DateTime 结构

来源:互联网 发布:win10网络唤醒 编辑:程序博客网 时间:2024/05/21 15:41

表示时间上的一刻,通常以日期和当天的时间表示。

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

时间值以 100 毫微秒为单位(该单位称为刻度)进行计量,而特定日期是自 GregorianCalendar 日历中公元 (C.E.) 0001 年 1 月 1 日午夜 12:00 以来的刻度数。例如,刻度值 31241376000000000L 表示 0100 年 1 月 1 日(星期五)午夜 12:00:00。DateTime 值始终在显式或默认日历的上下文中表示。

DateTime 值

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

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

UTC 时间适合于计算、比较日期和时间,以及将日期和时间存储在文件中。本地时间适合于在用户界面中显示。

如果 DateTime 对象的 Kind 属性为 Unspecified,则其未指定表示的时间为本地时间还是 UTC 时间。各个 DateTime 成员针对该成员相应地处理未指定的时间。 

DateTime 操作

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

本地时间和 UTC 时间之间的转换运算会考虑夏时制,但是算术和比较运算无需考虑。

DateTime 对象的计算和比较仅当这些对象表示同一时区中的时间时才有意义。因此,如果没有为 DateTime 对象指定时区,则假设开发人员有某种外部机制(如显式变量或策略)可用于确定创建该对象所在的时区。

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

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

DateTime 与 TimeSpan

DateTime 值类型与 TimeSpan 值类型的差异在于 DateTime 表示时间上的一刻,而 TimeSpan 表示时间间隔。例如,这表示您可以从 DateTime 的一个实例减去另一个实例来获得它们之间的时间间隔。也可以将正的 TimeSpan 加到当前的 DateTime 来计算将来的日期。

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

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;}int main(){   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 );   Console::WriteLine( "d1 ~= d1 [true]: {0}", RoughlyEquals( d1, d1, window, freq ) );   Console::WriteLine( "d1 ~= d2 [false]: {0}", RoughlyEquals( d1, d2, window, freq ) );   Console::WriteLine( "d1 ~= d3 [false]: {0}", RoughlyEquals( d1, d3, window, freq ) );   Console::WriteLine( "d1 ~= d4 [true]: {0}", RoughlyEquals( d1, d4, window, freq ) );   Console::WriteLine( "d1 ~= d5 [true]: {0}", RoughlyEquals( d1, d5, window, freq ) );   Console::WriteLine( "d1 ~= d6 [false]: {0}", RoughlyEquals( d1, d6, window, freq ) );   Console::WriteLine( "d1 ~= d7 [false]: {0}", RoughlyEquals( d1, d7, window, freq ) );   Console::WriteLine( "d1 ~= d8 [true]: {0}", RoughlyEquals( d1, d8, window, freq ) );   Console::WriteLine( "d1 ~= d9 [true]: {0}", RoughlyEquals( d1, d9, window, freq ) );}

将当前 DateTime 对象的值转换为协调通用时间 (UTC)

public:DateTime ToUniversalTime ()

返回值

一个 DateTime 对象,其 Kind 属性为 Utc,并且其值为等效于当前 DateTime 对象的值的 UTC;如果经转换的值过大以至于不能由 DateTime 对象表示,则为MaxValue,或者,如果经转换的值过小以至于不能由 DateTime 对象表示,则为 MinValue。 

UTC 时间等于本地时间减去 UTC 偏移量。有关 UTC 偏移量的更多信息,请参见 TimeZone.GetUtcOffset。转换还要考虑应用于当前 DateTime 对象所表示的时间的夏时制规则。 


此转换返回的值为 Kind 属性为 Utc 的 DateTime 对象。因此,即使 ToUniversalTime 反复应用于同一个 DateTime 对象,返回的仍然是有效结果。

此方法在进行计算时总是使用本地时区。


System::Console::WriteLine( "Enter a date and time." );String^ strDateTime = System::Console::ReadLine();System::DateTime localDateTime;try{   localDateTime = System::DateTime::Parse( strDateTime );}catch ( System::FormatException^ ) {   System::Console::WriteLine( "Invalid format." );   return;}System::DateTime univDateTime = localDateTime.ToUniversalTime();System::Console::WriteLine( "{0} local time is {1} universal time.",   localDateTime, univDateTime );System::Console::WriteLine( "Enter a date and time in universal time." );strDateTime = System::Console::ReadLine();try{   univDateTime = System::DateTime::Parse( strDateTime );}catch ( System::FormatException^ ) {   System::Console::WriteLine( "Invalid format." );   return;}localDateTime = univDateTime.ToLocalTime();System::Console::WriteLine( "{0} universal time is {1} local time.",   univDateTime, localDateTime );