C# 基础知识系列- 13 常见类库介绍(二)日期时间类
0. 前言
上一篇内容介绍了console类和math类,这篇内容着重介绍一下c#中时间日期的处理方式。
上一篇勘误: 上一篇中关于静态类没有构造函数,这一表述有误。正确的说法是c#中静态类不包含常规构造函数,但可以添加一个静态构造函数。
静态构造函数与普通普通构造函数的区别是,静态构造函数没有访问修饰符,即访问修饰符是默认的,且静态构造函数只能是无参的,并添加 static 修饰符;静态构造函数不能手动调用,会在类加载的时候由系统自己加载。
1 datetime 和 timespan
datetime表示时间点,timespan表示 时间段。在c#中,这两个都是结构体,结构体与类都能继承并实现接口,但是与类不同的是结构体在内存中存放在栈里。这部分在微软官方文档中关于clr有过介绍。后续也会针对clr写一个系列。这里就不做过多的介绍了。
datetime延伸开来也有很多内容要讲,这里只做一个大体的介绍:
1. 创建一个datetime
datetime time = new datetime(2018,1,20);// 2018年1月20日 0时0分0秒 datetime time = new datetime(2019,11,30, 12, 01, 59);// 2019年11月30日,12:01:59 datetime time = datetime.now;// 表示代码运行到这里的系统时间,一般意义上的当前时间 datetime time = new datetime(long ticks);// 以时间刻度计算日期,以公历 0001 年 1 月 1 日 00:00:00.000 以来所经历的以 100 纳秒为间隔的间隔数来表示
这些是我们常用的创建日期的方法,还有一些通过日历对象结合日历来创建日期时间,不过这块在不涉及到程序国际化之前不需要做过多的深入。
需要注意的是,datetime.now
在每次运行结果都不一样,这个属性返回的是系统运行时当前时间,而不是程序编写时的时间。与之对应的还有一个datime.today
,这个属性返回结果是当天,也就是now去掉时分秒的时间。
2. 日期变更
datetime提供了很多可以变更日期的方法,这些方法可以获取一个计算之后的时间值:
public datetime adddays (double value);// 计算天数,正数代表 天数增加,负数代表天数减少 public datetime addhours (double value);// 返回一个新的 datetime,它将指定的小时数加到此实例的值上。 public datetime addmilliseconds (double value);//返回一个新的 datetime,它将指定的毫秒数加到此实例的值上。 public datetime addmonths (int months);//返回一个新的 datetime,它将指定的月数加到此实例的值上 public datetime addmonths (int months);// 返回一个新的 datetime,它将指定的月数加到此实例的值上 public datetime addseconds (double value);/// 返回一个新的 datetime,它将指定的秒数加到此实例的值上。 public datetime addticks (long value);// 返回一个新的 datetime,它将指定的刻度数加到此实例的值上,也就是构造函数里的ticks public datetime addyears (int value);//返回一个新的 datetime,它将指定的年份数加到此实例的值上。
以上是datetime类对日期计算的支持,其中参数如果是正的表示时间后移,如果是负的则表示时间向前移。
需要注意的一点就是,日期的变更不会在原有的datetime元素上变更,会返回一个计算之后的日期类型。
3. 日期算术运算
说了这么多datetime,没有介绍timespan,那么这里就会介绍一下timespan是什么了。timespan表示一个时间间隔,也就是两个datetime之间的差值。说到这里,大家也应该明白日期的算术运算应该是指什么了。以下来看一组示例:
class program { static void main(string[] args) { datetime lastyear = new datetime(2019, 03, 08, 20,49, 36); datetime now = datetime.now; timespan span = now - lastyear; datetime newtime = lastyear + span; } }
这就是c#中关于日期运算的基本内容。那我们来看看 timespan里封装了哪些内容吧。
timespan的属性:
public int days { get; }//获取当前 timespan 结构所表示的时间间隔的天数部分。 public int hours { get; }// 获取当前 timespan 结构所表示的时间间隔的小时数部分。 public int milliseconds { get; }//获取当前 timespan 结构所表示的时间间隔的毫秒数部分。 public int minutes { get; }//获取当前 timespan 结构所表示的时间间隔的分钟数部分。 public int seconds { get; }//获取当前 timespan 结构所表示的时间间隔的秒数部分。
以上属性表示一个timespan的代表的时间间隔中的天数、小时、分钟等。
public double totaldays { get; }//获取以整天数和天的小数部分表示的当前 timespan 结构的值。 public double totalhours { get; }//获取以整小时数和小时的小数部分表示的当前 timespan 结构的值。 public double totalminutes { get; }//获取以整分钟数和分钟的小数部分表示的当前 timespan 结构的值。 public double totalseconds { get; }//获取以整秒数和秒的小数部分表示的当前 timespan 结构的值。 public double totalmilliseconds { get; }//获取以整毫秒数和毫秒的小数部分表示的当前 timespan 结构的值。
上述几组属性表示以xxx为单位,返回的timespan的值,与之相对应的timespan提供了一组formxxx的方法,可以将double类型的值还原成timespan。
因为timespan表示时间间隔,所以timespan也允许两个timespan进行加法运算,并提供了一个add(timespan ts)
的方法。
这些是timespan最常用的一些属性和方法。不过在使用timespan中需要注意的地方是,timespan计算返回的值可正可负,正值表示时间间隔的头在前尾在后,负值表示头在后尾在前;timespan中没有提供totalmonths这个方法,这是因为每个月具体有多少天不是固定值,如果想计算两个日期直接相差几个月,则需要自定义对应的计算方法了。
4. datetime与字符串之间的恩怨情仇
在程序中,用户或者三方输入的日期大多都是字符串格式的,而且系统获取到的时间也大多会转成字符串给其他人展示,所以这里就会涉及到datetime与字符串之间的相互转换。
我们先试试日期的各种tostring会产生什么样的结果:
class program { static void main(string[] args) { datetime now = datetime.now; console.writeline("tostring :{0}", now.tostring()); console.writeline("tolongdatestring :{0}", now.tolongdatestring()); console.writeline("tolongtimestring :{0}", now.tolongtimestring()); console.writeline("toshortdatestring :{0}",now.toshortdatestring()); console.writeline("toshorttimestring :{0}",now.toshorttimestring()); } }
结果:
这是datetime的默认输出结果,当然会根据系统的语言和地区等设置变化而产生不同的变化。为了避免这种变化,c#提供了一种日期类型的格式化模板,这里介绍几个常用的格式代表:
格式符 | 含义 |
---|---|
yy | 年份。00~99,如果年份大于99,则只保留后两位。如2020年则显示20,2019年则显示19 |
yyyy | 年份,显示四位。0000~9999 |
m | 月份,显示1~12 |
mm | 月份,显示01~12 |
d | 天,1~31(具体看月份允许的最大天数) |
dd | 与d一致,显示为01~31 |
h | 小时,12小时制显示1~12 |
hh | 与h一致,显示为01~12 |
h | 小时,24小时制,显示0~23 |
hh | 小时,24小时制,显示00~23 |
m | 分钟,显示0~59 |
mm | 分钟,显示00~59 |
s | 秒,显示0~59 |
ss | 秒,显示00~59 |
f | 表示日期和时间值的十分之几秒,显示0~9 |
ff | 表示百分之几秒,显示00~99 |
最后的f,f的次数越多精度越细,但需要考虑系统的时钟精度。
在实际开发中,最常用的格式是:yyyy-mm-dd hh:mm:ss
,显示效果就是:2020-04-25 12:00:00。其中连接符可以根据开发需求更换。
上述是时间转字符串,反过来也有字符串转时间。
使用datetime.parse
或者convert.todatetime
就可以将字符串转换为时间类型。c#并不需要在字符串转日期的时候指定字符串的显示格式,这是因为一个约定优于配置的设计理念。c#通过分析字符串,然后将字符串转换成对应的时间类型。当然,在正确解析到时间的时候,c#会抛出异常。为此,c#提供了datetime.tryparse
方法,该方法不会抛出异常,会返回一个是否正确转换的bool值。
它的声明如下:
public static bool tryparse (string s, out datetime result);// 使用了result作为实际转换结果
虽然c# 不用提供转换格式就可以读取,但是如果时间字符串的格式比较少见呢,或者说就想指定一个格式字符串,怎么办?别急,c#还提供了一个方法:
public static datetime parseexact (string s, string format, iformatprovider provider);
不过,这个方法需要指定一个区域性的格式信息:provider。这个信息可以通过cultureinfo.currentculture
来获取,这个属性表示系统的当前区域信息。
以上是datetime的基本内容,有兴趣的小伙伴可以查阅一下微软的官方文档继续深入研究一下。
更多内容烦请关注