在本教程中,我们展示了如何在 C# 中使用日期和时间。
C# DateTime
DateTime值类型表示日期和时间,其值的范围是 0001 年 1 月 1 日凌晨 00:00:00(午夜)(公元时代)至 Anno Domini(公共时代)至 9999 年 12 月 31 日晚上 11:59:59(公元) 公历。
C# TimeSpan
TimeSpan表示时间间隔(时间或经过的时间),以天,小时,分钟,秒和几分之一秒的正数或负数测量。 TimeZoneInfo提供了时区信息和可用于不同时区的工具。
C# 今天的日期
在第一个示例中,我们得到今天的日期。
Program.cs
using System;namespace Today{ class Program { static void Main(string[] args) { DateTime now = DateTime.Now; Console.WriteLine(now.ToString("F")); } }}该示例打印今天的日期。
DateTime now = DateTime.Now;
通过DateTime的Now属性,我们可以获取当地时间的当前日期和时间。
Console.WriteLine(now.ToString("F"));使用ToString()方法,我们格式化日期。 F说明符创建完整的日期和时间模式。
$ dotnet runTuesday, November 5, 2019 11:35:23 AM
这是程序的示例输出。
C# DateTime属性
DateTime代表时间的瞬间。 它的属性提供日期和时间的各个方面。
Program.cs
using System;namespace DateTimeProperties{ class Program { static void Main(string[] args) { string[] months = {"January", "February", "March", "April", "May", "June", "July", "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 runToday's date: 11/5/2019 12:00:00 AMToday is 5 day of DecemberToday is 309 day of 2019Today's time: 11:38:45.6791473Hour: 11Minute: 38Second: 45Millisecond: 679The day of week: TuesdayKind: Local
C# 加减DateTime
DateTime具有进行时间算术运算的方法。
Program.cs
using System;namespace TimeArithmetic{ class Program { static void Main(string[] args) { 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 runFriday, February 22, 2019 2:00:55 PMFriday, February 22, 2019 2:30:00 PMMonday, February 25, 2019 2:00:00 PMSunday, April 28, 2019 2:00:00 PMWednesday, December 19, 2018 2:00:00 PMWednesday, May 22, 2019 2:00:00 PMWednesday, February 22, 2023 2:00:00 PM
这是示例的输出。
C# UTC 时间
我们的星球是一个球体; 它绕其轴旋转。 地球向东旋转,因此太阳在不同位置的不同时间升起。 地球大约每 24 小时旋转一次。 因此,世界被划分为 24 个时区。 在每个时区,都有一个不同的本地时间。 夏令时通常会进一步修改此本地时间。
实际需要一个全球时间。 全球时间可以避免时区和夏令时的混淆。 UTC(世界标准时间)被选为主要时间标准。 UTC 用于航空,天气预报,飞行计划,空中交通管制通关和地图。 与当地时间不同,UTC 不会随季节变化而变化。
Program.cs
using System;namespace UniversalTime{ class Program { static void Main(string[] args) { 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 runUTC time 10:48:16Local time 11:48:16
对于 CET 时区,时差为一小时。
C# 本地化日期
DateTime允许我们显示特定区域性的日期和时间。
Program.cs
using System;using System.Globalization;namespace Localized{ class Program { static void Main(string[] args) { 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 runDnešný dátum a čas: utorok 5\. novembra 2019 12:03:25
这是程序的输出。
C# Unix 时间
Unix 时间是自 Unix 时代以来的秒数。 Unix 时间广泛用于计算。 没有方法可以在 C# 中获得 Unix 时间。 我们需要创建自己的计算。
Program.cs
using System;namespace UnixTime{ class Program { static void Main(string[] args) { long unixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); Console.WriteLine(unixTime); } }}该示例显示 Unix 时间。
long unixTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
我们使用ToUnixTimeSeconds()方法获得 Unix 时间。
$ dotnet run1572952370
此刻,自 Unix 时代以来已经过了1572952370秒。
C# TimeSpan
TimeSpan结构表示时间间隔。
subtract_times.cs
using System;namespace SubtractingTimes{ class Program { static void Main(string[] args) { 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 runTime elapsed: 13:30:00
区别是 13 小时 30 分钟。
在下面的示例中,我们减去两个日期值。
Program.cs
using System;namespace BorodinoBattle{ class Program { static void Main(string[] args) { 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."); } }}在示例中,我们计算了自 Borodino 战斗以来经过的天数。
DateTime now = DateTime.Today;DateTime borodino_battle = new DateTime(1812, 9, 7);
我们定义了两个DateTime对象:一个用于今天,另一个用于在 Borodino 战斗的日期。
TimeSpan diff = now - borodino_battle;
通过减去这两个对象,我们得到一个TimeSpan对象。
Console.WriteLine($"{diff.TotalDays} days have passed since the Battle of Borodino.");TotalDays属性具有经过时间的天数。
$ dotnet run75664 days have passed since the Battle of Borodino.
自 Borodino 战役以来,于 2019 年 11 月 5 日过去了 75664 天。
C# 格式化时间
日期和时间格式字符串定义了由格式化操作产生的DateTime或DateTimeOffset值的文本表示形式。 格式说明符有两种类型:标准和自定义。 自定义日期和时间格式字符串由两个或多个字符组成。
Program.cs
using System;namespace StandardSpecifiers{ class Program { static void Main(string[] args) { 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 run11/5/2019Tuesday, November 5, 2019Tuesday, November 5, 2019 1:05:46 PMNovember 52019-11-05T13:05:46.5778252+01:00Tue, 05 Nov 2019 13:05:46 GMT1:05 PM1:05:46 PMNovember 2019
自定义格式说明符使我们可以创建自定义的日期和时间格式模式。
Program.cs
using System;namespace CustomSpecifiers{ class Program { static void Main(string[] args) { 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说明符是小时,使用从 01 到 12 的 12 小时制时钟,mm是分钟,从 00 到 59,ss是秒,从 00 到 59,并且tt是 AM / PM 指示符。
$ dotnet runTue Nov 5, 201901:07:51 PM
C# 解析时间
DateTime's Parse()方法将日期和时间的字符串表示形式转换为其等效的DateTime。
Program.cs
using System;namespace ParseTime{ class Program { static void Main(string[] args) { 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 run5 November, 2019
C# 时区
时区是一个使用相同标准时间的区域。 世界上有 24 个时区。
UTC = local time + bias
偏差是 UTC 时间与本地时间之间的时差。
TimeZoneInfo是用于使用 C# 中的时区的类。
Program.cs
using System;namespace LocalZone{ class Program { static void Main(string[] args) { 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 runCurrent timezone: Central Europe Standard TimeDaylight name: Central Europe Daylight TimeBias: 01:00:00
在位于布拉迪斯拉发的系统上,我们获得了这些值。
GetSystemTimeZones()方法返回所有时区的排序集合,有关这些时区的信息在本地系统上可用。
Program.cs
using System;namespace TimeZones{ class Program { static void Main(string[] args) { var timezones = TimeZoneInfo.GetSystemTimeZones(); foreach (var timezone in timezones) { Console.WriteLine(timezone.Id); } } }}该示例在系统上打印可用时区的 ID。
$ dotnet run...Newfoundland Standard TimeTocantins Standard TimeE. South America Standard TimeSA Eastern Standard TimeArgentina Standard TimeGreenland Standard TimeMontevideo Standard TimeMagallanes Standard TimeSaint Pierre Standard TimeBahia Standard TimeUTC-02Mid-Atlantic Standard TimeAzores Standard TimeCape Verde Standard TimeUTC...
这是程序的部分输出。
还可以使用某些格式说明符从DateTime值中检索时区信息。
Program.cs
using System;namespace GetTimeZone{ class Program { static void Main(string[] args) { DateTime now = DateTime.Now; Console.WriteLine(now.ToString("%z")); Console.WriteLine(now.ToString("%K")); Console.WriteLine(now.ToString("o")); } }}该示例使用格式说明符来表示本地时区的偏差。
$ dotnet run+1+01:002019-11-05T13:02:26.2345688+01:00
这是反对。
C# 闰年
闰年是包含另一天的年份。 日历中额外一天的原因是天文日历年与日历年之间的差异。
Program.cs
using System;namespace LeapYears{ class Program { static void Main(string[] args) { // 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"); } } } }}我们有很多年。 我们检查所有年份是否为 leap 年。 IsLeapYear()功能确定年份是否为 a 年。
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()功能检查年份是否为 a 年。
$ dotnet run2000 is a leap year2002 is not a leap year2004 is a leap year2008 is a leap year2012 is a leap year2016 is a leap year2020 is a leap year1900 is not a leap year1800 is not a leap year1600 is a leap year
