C#日期与时间

本文介绍如何使用DateTime和TimeSpan等类型处理日期和时间,包括日期和时间的基本概念、DateTime结构成员、日期和时间的推算、日期和时间的格式化等内容。

基本概念

Tick(时钟的滴答声),是.NET Framework环境中处理时间的最小单位,1Tick表示一毫秒的万分之一,即一秒有1000万Ticks。

日期和处理范围,可以使用DateTime结构的MinValue和MaxValue字段读取,这两个字段的类型依然是DateTime结构类型,同时,可以使用Ticks属性获取日期和时间的整数处理范围,下面的代码显示了相关的数据。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.MinValue);  // 0001/1/1 0:00:00
            Console.WriteLine(DateTime.MinValue.Ticks);  // 0
            Console.WriteLine(DateTime.MaxValue);  // 9999/12/31 23:59:59
            Console.WriteLine(DateTime.MaxValue.Ticks);  // 3155378975999999999
        }
    }
}

从代码输出中可以看到,DateTime结构处理的最小时间为公元1年1月1日的0点,此时的Ticks值为0;最大的时间点为公元9999年12月31日23点59分59秒。

UTC时间与时区。UTC是协调世界时间,世界各地处理时间的标准。全球分为24个时区,即每15个经度一个时区,0时区以格林尼台天文台东西各7.5度,然后向东为东区(正区),共11个时区,北京时间位于东八区(+08:00);格林尼台向西称为西区(负区),共12个时区。由西12区到东11区时,日期要加一天。

DateTime结构类型

DateTime结构是处理日期和时间的主要类型,定义在System命名空间。DateTime结构的常用构造函数包括:

  • DateTime(),无参数时,包含的日期和时间信息为DateTime.MinValue值。
  • DateTime(ticks),通过Ticks值设置日期和时间信息。
  • DateTime(year,month,day),通过年、月、日设置日期,时间值为0。
  • DateTime(year,month,day,hour,minute,second),通过年、月、日、时、分、秒设置日期和时间信息。还可以使用第7个参数设置毫秒数。

DateTime结构常用的静态成员有:

  • Now属性,获取系统当前日期和时间,返回DateTime类型。
  • Today属性,获取系统当前日期,时间信息为0,返回DateTime类型。
  • UtcNow属性,根据系统时间和时区设置获取对应的UTC时间,返回DateTime类型。
  • IsLeapYear()方法,判断年份是否为闰年,如DateTime.IsLeapYear(2000)返回true。
  • DaysInMonth()方法,返回指定年份中某月有几天,如DateTime.DaysInMonth(2000,2)返回29,即2000年为闰年,2月有29天。

从DateTime中读取具体的日期和时间要素时,可以使用如下属性:

  • Year,年。
  • Month,月。
  • Day,月份中的第几天。
  • Hour,时。
  • Minute,分。
  • Second,秒。
  • Millisecond,毫秒。一秒等于1000毫秒。
  • Ticks,Tick值。
  • DayOfWeek,星期几。返回值为DayOfWeek枚举类型,其枚举值和对应的数值包括:Sunday(0)、Monday(1)、Tuesday(2)、Wednesday(3)、Thursday(4)、Friday(5)、Saturday(6)。
  • DayOfYear,一年中的第几天,返回值1到366之间。

DateTime结构中常用的转换方法有:

  • ToUniversalTime()方法,当DateTime中的时间信息转换为对应的UTC时间。
  • ToOADate()方法,转换为OA时间(Excel中的日期和时间处理标准),返回类型为double类型,其中,整数部分为日期数据,表示距离1899/12/30 0:00:00的天数;小数部分为时间,表示时间在一天中的比例,如0.5表示中午12点。
  • FromOADate()静态方法,将double数据包含的OA时间信息转换为DateTime结构。

日期和时间的推算

日期和时间推算时,可以使用DateTime结构的如下方法:

  • AddYears(int)
  • AddMonths(int)
  • AddDays(double)
  • AddHours(double)
  • AddMinutes(double)
  • AddSeconds(double)
  • AddMilliseconds(double)
  • AddTicks(long)

这些方法都使用一个数值作为参数,设置为正数时向后推算,设置为负数时向前推算;请注意参数类型,根据年和月推算时需要使用int类型,因为每年和每月的天数可能不同;根据Tick值推算时参数为long类型;其它方法使用double类型。下面的代码演示了日期和时间的推算。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dt = new DateTime(2026, 3, 1, 6, 0, 0);
            Console.WriteLine(dt.AddYears(3));  // 2029/3/1 6:00:00
            Console.WriteLine(dt.AddMonths(15));  // 2027/6/1 6:00:00
            Console.WriteLine(dt.AddDays(1.5)); // 2026/3/2 18:00:00
        }
    }
}

DateTime结构的Subtract()方法可以计算两个时间点的间隔,参数为DateTime类型,返回值为TimeSpan类型,可以使用如下属性获取间隔的日期和时间数据:

  • Days,int类型,返回天数分量值。
  • Hours,int类型,返回小时分量值。
  • Minutes,int类型,返回分钟分量值。
  • Seconds,int类型,返回秒分量值。
  • Milliseconds,int类型,返回毫秒分量值。
  • Ticks,long类型,返回结构中包含的Ticks值。
  • TotalDays,double类型,返回以天为单位的完整数据。
  • TotalHours,double类型,返回以小时为单位的完整数据。
  • TotalMinutes,double类型,返回以分钟为单位的完整数据。
  • TotalSeconds,double类型,返回以秒为单位的完整数据。
  • TotalMilliseconds,double类型,返回以毫秒为单位的完整数据。

下面的代码演示了Subtract()方法和读取时间间隔信息的应用。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dt1 = new DateTime(2026, 3, 1, 6, 0, 0);
            DateTime dt2 = new DateTime(2026, 3, 2, 18, 0, 0);
            TimeSpan ts = dt1.Subtract(dt2);
            Console.WriteLine(ts.Days);  // -1
            Console.WriteLine(ts.TotalDays);  // -1.5
            Console.WriteLine(ts.Hours);  // -12
        }
    }
}

代码中,dt1.Subtract(dt2)执行的是dt1-dt2操作,其中,dt1比dt2早了一天12小时间;第一个输出,只读取天的分量数,表示dt1比dt2早了一天;第二个输出,读取以天为单位的全部数据,即dt1比dt2早了一天半(1.5);第三个输出读取了小时的分量值,dt1比dt2早了12个小时。本例,使用dt2.Subtract(dt1)计算结果会显示为正数。

日期和时间的格式化

DateTime结构中包含了一些基本的日期和时间格式化方法:

  • ToLongDateString(),返回系统设置中的长日期格式字符串。
  • ToShortDateString(),返回系统设置中的短日期格式字符串。
  • ToLongTimeString(),返回系统设置中的长时间格式字符串。
  • ToShortTimeString(),返回系统设置中的短时间格式字符串。

ToString()方法中,如果不带参数,则显示为ToShortDateString()和ToLongTimeString()方法的组合,日期和时间中间使用空格分隔。下面的代码演示了相关应用,请注意,系统设置为北京时间时区,语言为简体中文。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dt = new DateTime(2026, 3, 1, 6, 0, 0);
            Console.WriteLine(dt.ToString());  // 2026/3/1 6:00:00
            Console.WriteLine(dt.ToLongDateString());  // 2026年3月1日
            Console.WriteLine(dt.ToShortDateString());  // 2026/3/1
            Console.WriteLine(dt.ToLongTimeString());  // 6:00:00
            Console.WriteLine(dt.ToShortTimeString());  // 6:00
        }
    }
}

ToString()方法的参数还可以使用字符串指定日期和时间的格式化字符,如:

  • y,显示一到两位年份。
  • yy,两位年份,一位数时添加前导0。
  • yyyy,四位年份。
  • yyyyy,五位年份。
  • MM,两位月份,一位数时添加前导0。
  • MMM,月份名称的简写形式。
  • MMMM,月份名称的完整形式。
  • d,月份中的第几天。
  • dd,月份中的第几天,一位数时添加前导0。
  • ddd,星期名称的简写形式,如“周一”。
  • dddd,星期名称的完整形式,如“星期一”。
  • h,12小时制的小时。
  • hh,12小时制的小时,一位数时添加前导0。
  • H,24小时制的小时。
  • HH,24小时制的小时,一位数时添加前导0。
  • mm,分钟,一位数时添加前导0。
  • ss,秒,一位数时添加前导0。
  • 1到7个f,显示秒后对应的位置,表示十分之一秒、百分之一秒、……。使用大写F时,只显示非0值。
  • t,显示A(AM)或P(PM)。
  • tt,显示AM或PM。
  • K,显示时区信息。
  • z,显示时间,只包含小时部分。
  • zz,显示时区,只包含小时部分,一位数时添加前导0。
  • zzz,显示时区,包含小时和分钟部分。
  • g或gg,显示纪元,如“公元”。

下面的代码演示了自定义格式化日期和时间的基本应用。

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dt = new DateTime(2026, 3, 1, 6, 22, 33);
            Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss.fff"));
        }
    }
}

执行代码显示为“2026/03/01 06:22:33.000”。