using System;
class Program
{
static void Main()
{
var launch = new DateTime(2026, 9, 24); // midnight
var meeting = new DateTime(2026, 9, 24, 14, 30, 0); // 14:30:00
var precise = new DateTime(2026, 9, 24, 14, 30, 5, 250); // with milliseconds
Console.WriteLine(launch.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine(meeting.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine(precise.ToString("HH:mm:ss.fff"));
Console.WriteLine($"{meeting.Year} {meeting.Month} {meeting.Day}");
Console.WriteLine($"{meeting.Hour}:{meeting.Minute}");
Console.WriteLine(meeting.DayOfWeek);
Console.WriteLine(meeting.DayOfYear);
Console.WriteLine(meeting.Date.ToString("yyyy-MM-dd HH:mm")); // time set to 00:00
Console.WriteLine(meeting.TimeOfDay); // a TimeSpan
}
}
using System;
class Program
{
static void Main()
{
DateTime local = DateTime.Now; // local time zone
DateTime utc = DateTime.UtcNow; // Coordinated Universal Time
DateTime today = DateTime.Today; // local date, time 00:00:00
Console.WriteLine($"Now: {local:yyyy-MM-dd HH:mm:ss} ({local.Kind})");
Console.WriteLine($"UtcNow: {utc:yyyy-MM-dd HH:mm:ss} ({utc.Kind})");
Console.WriteLine($"Today: {today:yyyy-MM-dd HH:mm:ss}");
}
}
这个例子中本地时区比 UTC 早两个小时,所以前两行相差两小时;在设置为 UTC 的机器上,两者相同。Kind 属性记录一个值是 Local、Utc 还是 Unspecified(自己构造的日期默认是这个)。凡是要存储、记录日志、比较或发送给其他系统的时间,都用 DateTime.UtcNow:它不会在夏令时开始或结束时跳变,而且在每台服务器上都代表同一个时刻。只在把值显示给人看时才转换为本地时间。
using System;
class Program
{
static void Main()
{
var deadline = new DateTime(2026, 10, 1, 17, 0, 0);
var submitted = new DateTime(2026, 10, 1, 18, 45, 0);
Console.WriteLine(submitted > deadline); // late by time
Console.WriteLine(submitted.Date == deadline.Date); // same day
Console.WriteLine(DateTime.Compare(submitted, deadline)); // 1: later
var start = new DateTime(2026, 9, 1);
var end = new DateTime(2026, 9, 30);
var check = new DateTime(2026, 9, 24, 12, 0, 0);
Console.WriteLine(check >= start && check < end.AddDays(1)); // in range, inclusive of the end day
DateTime earliest = start < check ? start : check;
Console.WriteLine(earliest.ToString("yyyy-MM-dd"));
}
}
输出:
True
True
1
True
2026-09-01
要判断“这个时间戳是否在 9 月 30 日之内?”,应该像上面那样,用 < 与下一天的开始时间比较。写成 check <= end 会把最后一天午夜之后的时间全部排除在外,因为 end 是 2026-09-30 00:00:00。
比较只看 tick,不看 Kind:一个 Local 值和一个 Utc 值只要打印出来一样,就被视为相等,尽管它们是不同的时刻。这也是存储时间要用 UTC 的另一个理由。
using System;
class Program
{
static void Main()
{
var date = new DateTime(2026, 9, 24);
Console.WriteLine(date.DayOfWeek);
Console.WriteLine((int)date.DayOfWeek);
bool weekend = date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday;
Console.WriteLine($"Weekend: {weekend}");
// Monday of the same week
int sinceMonday = ((int)date.DayOfWeek + 6) % 7;
DateTime monday = date.AddDays(-sinceMonday);
Console.WriteLine($"Week starts {monday:yyyy-MM-dd} ({monday.DayOfWeek})");
// Next Friday (today counts if it is Friday)
int toFriday = ((int)DayOfWeek.Friday - (int)date.DayOfWeek + 7) % 7;
Console.WriteLine($"Next Friday: {date.AddDays(toFriday):yyyy-MM-dd}");
// First and last day of the month
var first = new DateTime(date.Year, date.Month, 1);
var last = first.AddMonths(1).AddDays(-1);
Console.WriteLine($"{first:yyyy-MM-dd} to {last:yyyy-MM-dd}");
}
}
输出:
Thursday
4
Weekend: False
Week starts 2026-09-21 (Monday)
Next Friday: 2026-09-25
2026-09-01 to 2026-09-30
using System;
class Program
{
static int Age(DateTime birth, DateTime today)
{
int age = today.Year - birth.Year;
if (birth.Date > today.AddYears(-age)) age--; // birthday not reached yet this year
return age;
}
static void Main()
{
var today = new DateTime(2026, 9, 24);
Console.WriteLine(Age(new DateTime(1990, 9, 24), today)); // birthday today
Console.WriteLine(Age(new DateTime(1990, 9, 25), today)); // tomorrow
Console.WriteLine(Age(new DateTime(2008, 2, 29), today)); // leap day
var nextBirthday = new DateTime(today.Year, 12, 3);
if (nextBirthday < today) nextBirthday = nextBirthday.AddYears(1);
Console.WriteLine($"{(nextBirthday - today).Days} days to go");
}
}
输出:
36
35
18
70 days to go
DateTimeOffset
除了含糊的 Kind 标志,DateTime 并不记录自己属于哪个时区。DateTimeOffset 把值和它相对 UTC 的偏移量一起保存,所以它总是标识一个确切的时刻:
using System;
class Program
{
static void Main()
{
var placed = new DateTimeOffset(2026, 9, 24, 14, 0, 0, TimeSpan.FromHours(2)); // UTC+2
var received = new DateTimeOffset(2026, 9, 24, 8, 30, 0, TimeSpan.FromHours(-4)); // UTC-4
Console.WriteLine(placed.ToString("yyyy-MM-dd HH:mm zzz"));
Console.WriteLine(placed.UtcDateTime.ToString("yyyy-MM-dd HH:mm"));
Console.WriteLine(received.UtcDateTime.ToString("yyyy-MM-dd HH:mm"));
Console.WriteLine(received - placed); // compared as moments
Console.WriteLine(placed.ToOffset(TimeSpan.FromHours(9)).ToString("HH:mm zzz"));
}
}