目录
一、概述
二、时间的基本用法
1.实例化 DateTime
2.获取当前的时间
3.获取当前时间的时分秒
三、格式化时间
1.将时间转换为特定字符串
1)拼接字符串方式
2)格式化字符串方式
2.将字符串转换为时间
1)DateTime.Parse
2)DateTime.TryParse
3)DateTimeOffset.Parse
4)DateTimeOffset.TryParse
四、时间的加减运算
结束
一、概述
在 C# 中,DateTime 用于处理日期和时间的内置类,其值范围为 00:00:00 (午夜) , 0001年1月1日,安诺·多米尼 (公历) 年12月31日晚上11:59:59 (公历 ) 。
时间值以 100 纳秒为单位进行测量,称为刻度。 特定日期是自 A.0001 年 1 月 1 日午夜 12:00 以来的时钟周期数, (日历中的 GregorianCalendar C.E.) 。 该数字不包括按闰秒添加的刻度。 例如,刻度值为 31241376000000000L 表示星期五,0100 年 1 月 1 日 12:00:00 午夜。 DateTime 值始终在显式或默认日历的上下文中表示。
下面是 DateTime 的一些常用方法,其实 DateTime 远比这些基础的内容复杂,有需要的参考微软官方的文档。
时间比较,时间数据转换,时间间隔计算,获取网络时间,时间戳,时区时间 在文章的第二篇
C# 时间计算(二)-CSDN博客
二、时间的基本用法
1.实例化 DateTime
可以根据 年,月,日,小时,分钟,秒,毫秒 来实例化一个新的 DateTime,例:
DateTime dt = new DateTime(2023, 11, 22, 10, 23, 10, 45);
也可以只定义一个年,月,日就可以
DateTime dt = new DateTime(2023, 11, 22);
如果不进行实例化,那么时间默认就是 0001/1/1 0:00:00
代码 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test2
{
internal class Program
{
static DateTime dt;
static void Main(string[] args)
{
Console.WriteLine(dt);
Console.ReadKey();
}
}
}
运行:
关于 DateTime 的构造函数,可以参考微软的官方文档,下面的截图只是其中的一部分。
微软官方文档:点击跳转
2.获取当前的时间
使用代码 DateTime.Now 来获取当前时间。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
Console.WriteLine(dt);
Console.ReadKey();
}
}
}
运行:
3.获取当前时间的时分秒
在上节中,介绍了怎么获取当前时间,在获取到 DateTime 的值后,就可以根据 DateTime 来获取当前时间的日期,时,分,秒,毫秒 等
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
Console.WriteLine("年:{0}", dt.Year);
Console.WriteLine("月:{0}", dt.Month);
Console.WriteLine("日:{0}", dt.Day);
Console.WriteLine("分:{0}", dt.Minute);
Console.WriteLine("毫秒:{0}", dt.Millisecond);
Console.ReadKey();
}
}
}
运行:
三、格式化时间
1.将时间转换为特定字符串
如果将 DateTime.Now 直接转换为字符串,那么格式就如下图所示:
现在有几个问题,如果要将当前的时间写入数据库,那么上图的格式部分数据库是不支持的,也有软件需求,要求指定的时间格式,比如 2023.11.24 14:40:23 ,遇到这种需求我们就不得不改代码了,在这里有两种解决方案。
1)拼接字符串方式
在上面的章节中,不是讲了怎样获取 DateTime 的时、分、秒么,那我们用字符串拼接一下就好了,代码如下:
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
string time1 = $"{dt.Year}.{dt.Month}.{dt.Day} {dt.Hour}:{dt.Minute}:{dt.Second}";
Console.WriteLine(time1);
Console.ReadKey();
}
}
}
运行:
效果是有了,但是这样写十分的麻烦,代码量又多,下面我来介绍更简单的方法
2)格式化字符串方式
上节的问题,微软当然也会考虑到,在 DateTime 的 ToString 方法,就是用来解决这个问题的,代码如下:
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
string time = DateTime.Now.ToString("yyyy.mm.dd hh:mm:ss:ffff");
Console.WriteLine(time);
Console.ReadKey();
}
}
}
运行:
具体需要什么格式,其实自己随便定义,比如下面这种方式
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
string time = DateTime.Now.ToString("yyyy-mm-dd hh:mm:ss");
Console.WriteLine(time);
Console.ReadKey();
}
}
}
运行:
或者你只需要年、月、日,或者只要 小时、分钟,秒 那也是可以的
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
string time = DateTime.Now.ToString("yyyy-mm-dd");
Console.WriteLine(time);
Console.ReadKey();
}
}
}
运行:
具体的说明文档,或者参考官方地址:点击跳转
格式说明符 | 说明 | 示例 |
---|---|---|
"d" | 一个月中的某一天(1 到 31)。 | 2009-06-01T13:45:30 -> 1 2009-06-15T13:45:30 -> 15 |
“dd” | 一个月中的某一天(01 到 31)。 | 2009-06-01T13:45:30 -> 01 2009-06-15T13:45:30 -> 15 |
“ddd” | 一周中某天的缩写名称。 | 2009-06-15T13:45:30 -> Mon (en-US) 2009-06-15T13:45:30 -> Пн (ru-RU) 2009-06-15T13:45:30 -> lun. (fr-FR) |
“dddd” | 一周中某天的完整名称。 | 2009-06-15T13:45:30 -> Monday (en-US) 2009-06-15T13:45:30 -> понедельник (ru-RU) 2009-06-15T13:45:30 -> lundi (fr-FR) |
“f” | 日期和时间值的十分之几秒。 | 2009-06-15T13:45:30.6170000 -> 6 2009-06-15T13:45:30.05 -> 0 |
“ff” | 日期和时间值的百分之几秒。 | 2009-06-15T13:45:30.6170000 -> 61 2009-06-15T13:45:30.0050000 -> 00 |
“fff” | 日期和时间值的千分之几秒。 | 6/15/2009 13:45:30.617 -> 617 6/15/2009 13:45:30.0005 -> 000 |
“ffff” | 日期和时间值的万分之几秒。 | 2009-06-15T13:45:30.6175000 -> 6175 2009-06-15T13:45:30.0000500 -> 0000 |
“fffff” | 日期和时间值的十万分之几秒。 | 2009-06-15T13:45:30.6175400 -> 61754 6/15/2009 13:45:30.000005 -> 00000 |
“ffffff” | 日期和时间值的百万分之几秒。 | 2009-06-15T13:45:30.6175420 -> 617542 2009-06-15T13:45:30.0000005 -> 000000 |
“fffffff” | 日期和时间值的千万分之几秒。 | 2009-06-15T13:45:30.6175425 -> 6175425 2009-06-15T13:45:30.0001150 -> 0001150 |
“F” | 如果非零,则为日期和时间值的十分之几秒。 | 2009-06-15T13:45:30.6170000 -> 6 2009-06-15T13:45:30.0500000 ->(无输出) |
“FF” | 如果非零,则为日期和时间值的百分之几秒。 | 2009-06-15T13:45:30.6170000 -> 61 2009-06-15T13:45:30.0050000 ->(无输出) |
“FFF” | 如果非零,则为日期和时间值的千分之几秒。 | 2009-06-15T13:45:30.6170000 -> 617 2009-06-15T13:45:30.0005000 ->(无输出) |
“FFFF” | 如果非零,则为日期和时间值的万分之几秒。 | 2009-06-15T13:45:30.5275000 -> 5275 2009-06-15T13:45:30.0000500 ->(无输出) |
“FFFFF” | 如果非零,则为日期和时间值的十万分之几秒。 | 2009-06-15T13:45:30.6175400 -> 61754 2009-06-15T13:45:30.0000050 ->(无输出) |
“FFFFFF” | 如果非零,则为日期和时间值的百万分之几秒。 | 2009-06-15T13:45:30.6175420 -> 617542 2009-06-15T13:45:30.0000005 ->(无输出) |
“FFFFFFF” | 如果非零,则为日期和时间值的千万分之几秒。 | 2009-06-15T13:45:30.6175425 -> 6175425 2009-06-15T13:45:30.0001150 -> 000115 |
“g”、“gg” | 时期或纪元。 | 2009-06-15T13:45:30.6170000 -> A.D. |
“h” | 采用 12 小时制的小时(从 1 到 12)。 | 2009-06-15T01:45:30 -> 1 2009-06-15T13:45:30 -> 1 |
“hh” | 采用 12 小时制的小时(从 01 到 12)。 | 2009-06-15T01:45:30 -> 01 2009-06-15T13:45:30 -> 01 |
“H” | 采用 24 小时制的小时(从 0 到 23)。 | 2009-06-15T01:45:30 -> 1 2009-06-15T13:45:30 -> 13 |
“HH” | 采用 24 小时制的小时(从 00 到 23)。 | 2009-06-15T01:45:30 -> 01 2009-06-15T13:45:30 -> 13 |
“K” | 时区信息。 | 带 DateTime 值: 2009-06-15T13:45:30, Kind Unspecified -> 2009-06-15T13:45:30, Kind Utc -> Z 2009-06-15T13:45:30, Kind Local -> -07:00(取决于本地计算机的设置) 带DateTimeOffset 值: 2009-06-15T01:45:30-07:00 --> -07:00 2009-06-15T08:45:30+00:00 --> +00:00 |
“m” | 分钟(0 到 59)。 | 2009-06-15T01:09:30 -> 9 2009-06-15T13:29:30 -> 29 |
“mm” | 分钟(00 到 59)。 | 2009-06-15T01:09:30 -> 09 2009-06-15T01:45:30 -> 45 |
“M” | 月份(1 到 12)。 | 2009-06-15T13:45:30 -> 6 |
“MM” | 月份(01 到 12)。 | 2009-06-15T13:45:30 -> 06 |
“MMM” | 月份的缩写名称。 | 2009-06-15T13:45:30 -> Jun (en-US) 2009-06-15T13:45:30 -> juin (fr-FR) 2009-06-15T13:45:30 -> Jun (zu-ZA) |
“MMMM” | 月份的完整名称。 | 2009-06-15T13:45:30 -> June (en-US) 2009-06-15T13:45:30 -> juni (da-DK) 2009-06-15T13:45:30 -> uJuni (zu-ZA) |
“s” | 秒(0 到 59)。 | 2009-06-15T13:45:09 -> 9 |
“ss” | 秒(00 到 59)。 | 2009-06-15T13:45:09 -> 09 |
“t” | AM/PM 指示符的第一个字符。 | 2009-06-15T13:45:30 -> P (en-US) 2009-06-15T13:45:30 -> 午 (ja-JP) 2009-06-15T13:45:30 -> (fr-FR) |
“tt” | AM/PM 指示符。 | 2009-06-15T13:45:30 -> PM (en-US) 2009-06-15T13:45:30 -> 午後 (ja-JP) 2009-06-15T13:45:30 -> (fr-FR) |
“y” | 年份(0 到 99)。 | 0001-01-01T00:00:00 -> 1 0900-01-01T00:00:00 -> 0 1900-01-01T00:00:00 -> 0 2009-06-15T13:45:30 -> 9 2019-06-15T13:45:30 -> 19 |
“yy” | 年份(00 到 99)。 | 0001-01-01T00:00:00 -> 01 0900-01-01T00:00:00 -> 00 1900-01-01T00:00:00 -> 00 2019-06-15T13:45:30 -> 19 |
“yyy” | 年份(最少三位数字)。 | 0001-01-01T00:00:00 -> 001 0900-01-01T00:00:00 -> 900 1900-01-01T00:00:00 -> 1900 2009-06-15T13:45:30 -> 2009 |
“yyyy” | 由四位数字表示的年份。 | 0001-01-01T00:00:00 -> 0001 0900-01-01T00:00:00 -> 0900 1900-01-01T00:00:00 -> 1900 2009-06-15T13:45:30 -> 2009 |
“yyyyy” | 由五位数字表示的年份。 | 0001-01-01T00:00:00 -> 00001 2009-06-15T13:45:30 -> 02009 |
“z” | 相对于 UTC 的小时偏移量,无前导零。 | 2009-06-15T13:45:30-07:00 -> -7 |
“zz” | 相对于 UTC 的小时偏移量,带有表示一位数值的前导零。 | 2009-06-15T13:45:30-07:00 -> -07 |
“zzz” | 相对于 UTC 的小时和分钟偏移量。 | 2009-06-15T13:45:30-07:00 -> -07:00 |
":" | 时间分隔符。 | 2009-06-15T13:45:30 -> : (en-US) 2009-06-15T13:45:30 -> . (it-IT) 2009-06-15T13:45:30 -> : (ja-JP) |
"/" | 日期分隔符。 | 2009-06-15T13:45:30 -> / (en-US) 2009-06-15T13:45:30 -> - (ar-DZ) 2009-06-15T13:45:30 -> . (tr-TR) |
"string" 'string' | 文本字符串分隔符。 | 2009-06-15T13:45:30 ("arr:" h:m t) -> arr: 1:45 P 2009-06-15T13:45:30 ('arr:' h:m t) -> arr: 1:45 P |
% | 将下面的字符定义为自定义格式说明符。 | 2009-06-15T13:45:30 (%h) -> 1 |
\ | 转义字符。 | 2009-06-15T13:45:30 (h \h) -> 1 h |
任何其他字符 | 字符将复制到未更改的结果字符串。 | 2009-06-15T01:45:30 (arr hh:mm t) -> arr 01:45 A |
2.将字符串转换为时间
将字符串转换为时间,可以使用 DateTime 和 DateTimeOffset 这两种方式进行转换,DateTimeOffset 和 DateTime 不同之处在于,DateTimeOffset 还包含了一个时区信息,每个国家的时间都是不一样的,如果涉及到时区,可以使用 DateTimeOffset 来计算。
1)DateTime.Parse
直接将字符串转换为时间,如果字符串不符合标准,那么会报错
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt = DateTime.Parse("2023-11-24 19:30:23");
Console.WriteLine(dt);
Console.ReadKey();
}
}
}
运行:
2)DateTime.TryParse
尝试将字符串转换为时间,如果字符串不符合标准,那么返回值为 false
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt;
bool result = DateTime.TryParse("2023-11-24 11:59:13", out dt);
Console.WriteLine("转换结果:{0}", result);
Console.WriteLine(dt);
Console.ReadKey();
}
}
}
运行:
3)DateTimeOffset.Parse
将字符串直接转换为时间,如果字符串不符合标准,那么会报错
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTimeOffset dt = DateTimeOffset.Parse("2023-11-24 19:30:23");
Console.WriteLine(dt);
Console.ReadKey();
}
}
}
运行:
4)DateTimeOffset.TryParse
尝试将字符串转换为时间,如果字符串不符合标准,那么返回值为 false
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTimeOffset dt;
bool result = DateTimeOffset.TryParse("2023-11-24 11:59:13", out dt);
Console.WriteLine("转换结果:{0}", result);
Console.WriteLine(dt);
Console.ReadKey();
}
}
}
运行:
四、时间的加减运算
时间的加减计算其实也比较简单,复杂的部分底层已经做好了封装,我们只需要知道怎么用就行了,这里使用 DateTime 或者 DateTimeOffset 都可以,我简单介绍几个基本的案例。
例1:
使用 DateTime 自带的方法,AddDays ,AddHours 等等
代码:
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23"); ;
DateTime dt2 = dt1.AddHours(1);
Console.WriteLine(dt2);
Console.ReadKey();
}
}
}
效果:
例2:
上面的案例,一次只能加一个,如果我们想同时加上时分秒,可以使用 TimeSpan 来完成这个需求, TimeSpan 来定义时间部分是非常的方便的
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23");
TimeSpan timeSpan = new TimeSpan(1, 20, 50);//时、分、秒
DateTime dt2 = dt1.Add(timeSpan);
Console.WriteLine(dt2);
Console.ReadKey();
}
}
}
运行:
例3:
如果需要用一个时间,去减另一个时间,直接用运算符就可以解决了
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23");
DateTime dt2 = DateTime.Parse("2023-11-24 23:10:51");
TimeSpan timeSpan = dt2 - dt1;
Console.WriteLine(timeSpan);
Console.ReadKey();
}
}
}
效果:
关于时间的加减,其实还有很多的方法,比如用 DateTimeOffset 的相关接口,DateTime 的 Subtract 方法等等,方法非常的多,甚至还可以用 AddDays ,AddHours 来减时间,它不光是可以加时间,减时间只要将参数给负值就行了,如:
namespace Test2
{
internal class Program
{
static void Main(string[] args)
{
DateTime dt1 = DateTime.Parse("2023-11-24 19:30:23");
DateTime dt2 = dt1.AddHours(-1);
Console.WriteLine(dt2);
Console.ReadKey();
}
}
}
效果:
由于文字个数已经超了,后面的内容:时间比较,时间数据转换,时间间隔计算,获取网络时间,时间戳,时区时间转换 等,我将放到文章的第二部分。
C# 时间计算(二)-CSDN博客
结束
如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言
end