在本教程中,我们展示了如何在 C# 中使用日期和时间。 C# 教程是有关 C# 语言的综合教程。
C# DateTime
DateTime值类型表示日期和时间,其值的范围是公历 0001 年 1 月 1 日凌晨 00:00:00(午夜)(公元)至 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
This is a sample output of the program.
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
This is the output of the example.
自定义格式说明符使我们可以创建自定义的日期和时间格式模式。
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
This is the output of the program.
C# 解析时间
DateTime的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
This is the output of the example.
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");}}}}}
我们有很多年。 我们检查所有年份是否为闰年。 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
This is the output of the program.
在本文中,我们使用 C# 处理日期和时间。 在 C# 中读取网页显示了几种在 C# 中抓取网页的方法。 以 C# 读取文本文件涵盖了使用流以 C# 读取文本文件的过程。
