C# 中的日期和时间
上次修改于 2023 年 7 月 8 日
在本文中,我们将展示如何在 C# 中使用日期和时间。
DateTime 表示时间中的一个瞬间。 DateTime 的字符串表示形式是特定于文化的,并且取决于用于显示日期和时间的约定及其日历。 日历是组织日期时间单位的系统。
C# DateTime
DateTime 值类型表示日期和时间,值的范围从公元 (Common Era) 0001 年 1 月 1 日 00:00:00(午夜)到公元 (C.E.) 9999 年 12 月 31 日 23:59:59,采用公历。
C# TimeSpan
TimeSpan 表示一个时间间隔(时间长度或经过的时间),它以天、小时、分钟、秒和秒的小数的正数或负数来衡量。 TimeZoneInfo 提供时区信息和工具来处理不同的时区。
C# 今天日期
在我们的第一个例子中,我们获取今天的日期。
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("F"));
该示例打印今天的日期。
DateTime now = DateTime.Now;
使用 DateTime 的 Now 属性,我们可以获得本地时间的当前日期和时间。
Console.WriteLine(now.ToString("F"));
使用 ToString 方法,我们格式化日期。 F 说明符创建一个完整的日期和时间模式。
$ dotnet run Saturday, July 8, 2023 2:08:27 PM
C# DateTime 属性
DateTime 表示时间中的一个瞬间。 它的属性提供了日期和时间的各个方面。
string[] months = {"January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November", "December"};
DateTime now = DateTime.Now;
Console.WriteLine("Today's date: {0}", now.Date);
Console.WriteLine("Today is {0} day of {1}", now.Day, months[now.Month - 1]);
Console.WriteLine("Today is {0} day of {1}", now.DayOfYear, now.Year);
Console.WriteLine("Today's time: {0}", now.TimeOfDay);
Console.WriteLine("Hour: {0}", now.Hour);
Console.WriteLine("Minute: {0}", now.Minute);
Console.WriteLine("Second: {0}", now.Second);
Console.WriteLine("Millisecond: {0}", now.Millisecond);
Console.WriteLine("The day of week: {0}", now.DayOfWeek);
Console.WriteLine("Kind: {0}", now.Kind);
该示例检查 DateTime 对象的属性。
DateTime now = DateTime.Now;
创建一个 DateTime 对象。 DateTime 设置为此计算机上的当前本地日期和时间。
Console.WriteLine("Today's date: {0}", now.Date);
Date 属性获取 DateTime 实例的日期组成部分。
Console.WriteLine("Today is {0} day of {1}", now.Day, months[now.Month - 1]);
Day 属性获取月份中的日。 Month 属性返回月份组成部分,表示为 1 到 12 之间的值。
Console.WriteLine("Today is {0} day of {1}", now.DayOfYear, now.Year);
DayOfYear 属性获取年份中的日,Year 获取年份。
Console.WriteLine("Today's time: {0}", now.TimeOfDay);
TimeOfDay 属性获取 DateTime 实例的当天时间。
Console.WriteLine("Hour: {0}", now.Hour);
Console.WriteLine("Minute: {0}", now.Minute);
Console.WriteLine("Second: {0}", now.Second);
Console.WriteLine("Millisecond: {0}", now.Millisecond);
Hour、Minute、Second 和 Millisecond 是时间组成部分的一部分。
Console.WriteLine("The day of week: {0}", now.DayOfWeek);
DayOfWeek 属性获取星期几。
Console.WriteLine("Kind: {0}", now.Kind);
Kind 属性返回一个值,该值指示此 DateTime 实例表示的时间是基于本地时间、协调世界时 (UTC) 还是两者都不是。
$ dotnet run Today's date: 7/8/2023 12:00:00 AM Today is 8 day of July Today is 189 day of 2023 Today's time: 14:09:12.4107890 Hour: 14 Minute: 9 Second: 12 Millisecond: 410 The day of week: Saturday Kind: Local
C# 添加和减去 DateTime
DateTime 具有用于执行时间算术运算的方法。
DateTime dt = new DateTime(2019, 2, 22, 14, 0, 0);
DateTime dt1 = dt.AddSeconds(55);
DateTime dt2 = dt.AddMinutes(30);
DateTime dt3 = dt.AddHours(72);
DateTime dt4 = dt.AddDays(65);
DateTime dt5 = dt.AddDays(-65);
DateTime dt6 = dt.AddMonths(3);
DateTime dt7 = dt.AddYears(4);
Console.WriteLine(dt1.ToString("F"));
Console.WriteLine(dt2.ToString("F"));
Console.WriteLine(dt3.ToString("F"));
Console.WriteLine(dt4.ToString("F"));
Console.WriteLine(dt5.ToString("F"));
Console.WriteLine(dt6.ToString("F"));
Console.WriteLine(dt7.ToString("F"));
该示例展示了 DateTime 对象的六个方法。
DateTime dt1 = dt.AddSeconds(55);
AddSeconds 返回一个新的 DateTime,该对象将指定数量的秒数添加到此实例的值。
DateTime dt4 = dt.AddDays(65); DateTime dt5 = dt.AddDays(-65);
AddDays 将天数添加到 DateTime。 我们可以提供正值或负值。
$ dotnet run Friday, February 22, 2019 2:00:55 PM Friday, February 22, 2019 2:30:00 PM Monday, February 25, 2019 2:00:00 PM Sunday, April 28, 2019 2:00:00 PM Wednesday, December 19, 2018 2:00:00 PM Wednesday, May 22, 2019 2:00:00 PM Wednesday, February 22, 2023 2:00:00 PM
C# UTC 时间
我们的星球是一个球体; 它绕轴旋转。 地球向东旋转,因此太阳在不同的地点升起的时间不同。 地球大约在 24 小时内旋转一次。 因此,世界被划分为 24 个时区。 在每个时区中,都有不同的当地时间。 这种当地时间通常会因夏令时而进一步修改。
实际需要一个全球时间。 一个全球时间有助于避免关于时区和夏令时的混淆。 UTC(协调世界时)被选为主要的计时标准。 UTC 用于航空、天气预报、飞行计划、空中交通管制许可和地图。 与本地时间不同,UTC 不会随着季节的变化而变化。
DateTime now = DateTime.Now;
DateTime utc = DateTime.UtcNow;
Console.WriteLine($"UTC time {utc:HH:mm:ss}");
Console.WriteLine($"Local time {now:HH:mm:ss}");
该示例打印当前的 UTC 时间和本地时间。
DateTime utc = DateTime.UtcNow;
使用 DateTime 的 UtcNow 属性,我们可以获得 UTC 时间。
Console.WriteLine($"UTC time {utc:HH:mm:ss}");
我们格式化时间。
$ dotnet run UTC time 12:12:34 Local time 14:12:34
对于 CET 时区,时间相差一小时。
C# 本地化日期
DateTime 允许我们以特定的文化显示日期和时间。
using System.Globalization;
Console.OutputEncoding = System.Text.Encoding.UTF8;
DateTime now = DateTime.Now;
CultureInfo ci = new CultureInfo("sk-SK");
Console.WriteLine($"Dnešný dátum a čas: {now.ToString("F", ci)}");
该示例以斯洛伐克文化打印当前的日期和时间。
Console.OutputEncoding = System.Text.Encoding.UTF8;
为了正确输出带重音的斯洛伐克字符,我们将控制台输出编码设置为 UTF8。
CultureInfo ci = new CultureInfo("sk-SK");
我们创建一个斯洛伐克 CultureInfo,其中包括有关文化的名称、书写系统、使用的日历、字符串的排序顺序以及日期和数字的格式的信息。
Console.WriteLine($"Dnešný dátum a čas: {now.ToString("F", ci)}");
我们以完整的日期和时间格式模式打印日期和时间。
$ dotnet run Dnešný dátum a čas: sobota 8. júla 2023 14:12:02
C# Unix 时间
Unix 时间是自 Unix 纪元以来的秒数。 Unix 时间广泛应用于计算中。 在 C# 中没有获取 Unix 时间的方法。 我们需要创建自己的计算。
long unixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); Console.WriteLine(unixTime);
该示例打印 Unix 时间。
long unixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
我们使用 ToUnixTimeSeconds 方法获取 Unix 时间。
$ dotnet run 1688818383
此时,自 Unix 纪元以来已经过去了 1688818383 秒。
C# TimeSpan
TimeSpan 结构表示一个时间间隔。
string startTime = "7:00 AM";
string endTime = "8:30 PM";
TimeSpan elapsed = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));
Console.WriteLine($"Time elapsed: {elapsed}");
在该示例中,我们减去两个时间值。
string startTime = "7:00 AM"; string endTime = "8:30 PM";
我们定义两个表示为字符串的时间值。
TimeSpan elapsed = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));
Subtract 方法用于减去两个时间值。 Parse 方法将时间间隔的字符串表示形式转换为 TimeSpan 对象。
$ dotnet run Time elapsed: 13:30:00
差异为 13 小时 30 分钟。
在下面的示例中,我们减去两个日期值。
DateTime now = DateTime.Today;
DateTime borodino_battle = new DateTime(1812, 9, 7);
TimeSpan diff = now - borodino_battle;
Console.WriteLine($"{diff.TotalDays} days have passed since the Battle of Borodino.");
在该示例中,我们计算自博罗季诺战役以来经过的天数。
DateTime now = DateTime.Today; DateTime borodino_battle = new DateTime(1812, 9, 7);
我们定义两个 DateTime 对象:一个用于今天,一个用于博罗季诺战役的日期。
TimeSpan diff = now - borodino_battle;
通过减去这两个对象,我们得到一个 TimeSpan 对象。
Console.WriteLine($"{diff.TotalDays} days have passed since the Battle of Borodino.");
TotalDays 属性具有经过时间的总天数。
$ dotnet run 77005 days have passed since the Battle of Borodino.
截至 2023 年 7 月 8 日,自博罗季诺战役以来已经过去了 77005 天。
C# 格式化时间
日期和时间格式字符串定义了格式化操作产生的 DateTime 或 DateTimeOffset 值的文本表示形式。 有两种类型的格式说明符:标准格式和自定义格式。 自定义日期和时间格式字符串由两个或多个字符组成。
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("d"));
Console.WriteLine(now.ToString("D"));
Console.WriteLine(now.ToString("F"));
Console.WriteLine(now.ToString("M"));
Console.WriteLine(now.ToString("o"));
Console.WriteLine(now.ToString("R"));
Console.WriteLine(now.ToString("t"));
Console.WriteLine(now.ToString("T"));
Console.WriteLine(now.ToString("Y"));
该示例使用一些标准格式说明符打印今天的日期。
Console.WriteLine(now.ToString("d"));
d 说明符创建一个短日期模式。
Console.WriteLine(now.ToString("D"));
D 说明符创建一个长日期模式。
Console.WriteLine(now.ToString("F"));
F 说明符创建一个完整的日期和时间模式。
Console.WriteLine(now.ToString("M"));
M 说明符创建一个月和日模式。
Console.WriteLine(now.ToString("o"));
o 说明符创建一个往返日期和时间模式。 在此模式中,日期和时间部分由 T 字符分隔,并且时区偏差附加在字符串的末尾。
Console.WriteLine(now.ToString("R"));
R 说明符创建一个 RFC1123 日期和时间模式。
Console.WriteLine(now.ToString("t"));
t 说明符创建一个短时间模式。
Console.WriteLine(now.ToString("T"));
T 说明符创建一个长时间模式。
Console.WriteLine(now.ToString("Y"));
Y 说明符创建一个年份和月份模式。
$ dotnet run 7/8/2023 Saturday, July 8, 2023 Saturday, July 8, 2023 2:16:12 PM July 8 2023-07-08T14:16:12.9488634+02:00 Sat, 08 Jul 2023 14:16:12 GMT 2:16 PM 2:16:12 PM July 2023
自定义格式说明符允许我们创建自定义的日期和时间格式模式。
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("ddd MMM %d, yyyy"));
Console.WriteLine(now.ToString("hh:mm:ss tt"));
该示例使用自定义说明符打印日期和时间格式。
Console.WriteLine(now.ToString("ddd MMM %d, yyyy"));
ddd 说明符是星期几的缩写名称,MMM 是月份的缩写名称,d 是月份中的日,从 1 到 31。在自定义说明符的上下文中,它必须以 % 字符开头。 最后,yyyy 是年份,表示为四位数字。
Console.WriteLine(now.ToString("hh:mm:ss tt"));
hh 说明符是小时,使用 12 小时制,从 01 到 12,mm 是分钟,从 00 到 59,ss 是秒,从 00 到 59,tt 是 AM/PM 指示符。
$ dotnet run Sat Jul 8, 2023 02:15:36 PM
C# 解析时间
DateTime 的 Parse 方法将日期和时间的字符串表示形式转换为其 DateTime 等效形式。
string date_string = "11/5/2019";
DateTime dt = DateTime.Parse(date_string);
Console.WriteLine($"{dt:d MMMM, yyyy}");
该程序解析字符串中的日期。
string date_string = "11/5/2019";
这是一个以字符串表示的日期。
DateTime dt = DateTime.Parse(date_string);
使用 Parse 方法,我们将其解析为 DateTime 对象。
Console.WriteLine($"{dt:d MMMM, yyyy}");
日期以中间字节顺序打印到控制台。
$ dotnet run 5 November, 2019
C# 时区
时区 是使用相同标准时间的一个区域。世界上有 24 个时区。
UTC = local time + bias
偏差是 UTC 时间和本地时间之间的差异。
TimeZoneInfo 是一个用于在 C# 中使用时区的类。
TimeZoneInfo localZone = TimeZoneInfo.Local;
Console.WriteLine("Current timezone: {0}", localZone.StandardName);
Console.WriteLine("Daylight name: {0}", localZone.DaylightName);
Console.WriteLine("Bias: {0}", localZone.BaseUtcOffset);
该程序打印当前时区和偏差。
TimeZoneInfo localZone = TimeZoneInfo.Local;
使用 Local 属性,我们可以获得本地时区。
Console.WriteLine("Current timezone: {0}", localZone.StandardName);
Console.WriteLine("Daylight name: {0}", localZone.DaylightName);
StandardName 给出时区的标准名称,DaylightName 给出其夏令时名称。
Console.WriteLine("Bias: {0}", localZone.BaseUtcOffset);
BaseUtcOffset 属性产生偏差。
$ dotnet run Current timezone: Central Europe Standard Time Daylight name: Central Europe Daylight Time Bias: 01:00:00
在位于布拉迪斯拉发的系统中,我们获得这些值。
GetSystemTimeZones 方法返回一个排序的集合,其中包含本地系统上可用的所有时区的信息。
var timezones = TimeZoneInfo.GetSystemTimeZones();
foreach (var timezone in timezones)
{
Console.WriteLine(timezone.Id);
}
该示例打印系统上可用时区的 ID。
$ dotnet run ... Newfoundland Standard Time Tocantins Standard Time E. South America Standard Time SA Eastern Standard Time Argentina Standard Time Greenland Standard Time Montevideo Standard Time Magallanes Standard Time Saint Pierre Standard Time Bahia Standard Time UTC-02 Mid-Atlantic Standard Time Azores Standard Time Cape Verde Standard Time UTC ...
这是程序的局部输出。
时区信息也可以从带有某些格式说明符的 DateTime 值中检索。
DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("%z"));
Console.WriteLine(now.ToString("%K"));
Console.WriteLine(now.ToString("o"));
该示例使用格式说明符显示本地时区的偏差。
$ dotnet run +2 +02:00 2023-07-08T14:18:23.8369868+02:00
日历
日历是组织日期时间单位的系统。 文化使用不同的日历。 有些文化可以使用多个日历。
using System.Globalization;
Console.OutputEncoding = System.Text.Encoding.UTF8;
var perCi = new CultureInfo("fa-IR");
Console.WriteLine($"Default calendar: {perCi.Calendar}");
DateTime now = DateTime.Now;
foreach (var oc in perCi.OptionalCalendars)
{
perCi.DateTimeFormat.Calendar = oc;
Console.WriteLine($"{now.ToString("F", perCi)}");
}
波斯文化使用波斯历作为默认日历,而使用公历和伊斯兰历作为可选日历。 我们以所有支持的波斯日历显示当前的日期时间。
var perCi = new CultureInfo("fa-IR");
我们创建一个波斯 CultureInfo。
DateTime now = DateTime.Now;
我们获取当前的日期时间值。
foreach (var oc in perCi.OptionalCalendars)
{
perCi.DateTimeFormat.Calendar = oc;
Console.WriteLine($"{now.ToString("F", perCi)}");
}
我们遍历支持的日历数组。 我们将 DateTimeFormat.Calendar 设置为当前选择的日历,并打印日期时间。
$ dotnet run Default calendar: System.Globalization.PersianCalendar 1402 تیر 17, شنبه 13:35:18 2023 ژوئیهٔ 8, شنبه 13:35:18 1444 ذیحجهٔ 20, شنبه 13:35:18
HebrewCalendar 表示希伯来日历。
using System.Globalization;
Console.OutputEncoding = System.Text.Encoding.UTF8;
var hc = new HebrewCalendar();
var d1 = new DateTime(5776, 10, 7, hc);
Console.WriteLine($"{d1:d}");
Console.WriteLine($"{hc.GetYear(d1)}/{hc.GetMonth(d1)}/{hc.GetDayOfMonth(d1)}");
在该示例中,我们定义了希伯来日历中的日期时间,并以公历和希伯来历字符串表示形式打印它。
var hc = new HebrewCalendar(); var d1 = new DateTime(5776, 10, 7, hc);
日历作为 DateTime 构造函数的第四个参数传递。
$ dotnet run 6/13/2016 5776/10/7
C# 闰年
闰年是包含额外一天的年份。 日历中额外一天的原因是天文年和日历年之间的差异。
// Assume year >= 1582 in the Gregorian calendar.
int[] years = { 2000, 2002, 2004, 2008, 2012, 2016, 2020,
1900, 1800, 1600 };
foreach (int year in years)
{
if (DateTime.IsLeapYear(year))
{
Console.WriteLine($"{year} is a leap year");
} else
{
Console.WriteLine($"{year} is not a leap year");
}
}
我们有一个年份数组。 我们检查所有年份是否为闰年。 IsLeapYear 函数确定某年是否为闰年。
int[] years = { 2000, 2002, 2004, 2008, 2012, 2016, 2020,
1900, 1800, 1600 };
这是一个我们检查的年份数组。年份必须是公历。
foreach (int year in years)
{
if (DateTime.IsLeapYear(year))
{
Console.WriteLine($"{year} is a leap year");
}
else
{
Console.WriteLine($"{year} is not a leap year");
}
}
使用 for 循环遍历数组。 我们使用 IsLeapYear 函数检查某年是否为闰年。
$ dotnet run 2000 is a leap year 2002 is not a leap year 2004 is a leap year 2008 is a leap year 2012 is a leap year 2016 is a leap year 2020 is a leap year 1900 is not a leap year 1800 is not a leap year 1600 is a leap year
来源
在本文中,我们介绍了如何在 C# 中使用日期和时间。
作者
列出所有 C# 教程。