C#中时间类的使用方法详解
c#中时间类的使用方法详解
datetime类
datetime类是c#中最常用的时间类之一,它表示一个日期和时间。可以使用datetime.now属性获取当前时间,也可以使用datetime.parse方法将字符串转换为datetime对象。
// 获取当前时间 datetime now = datetime.now; // 将字符串转换为datetime对象 datetime datetime = datetime.parse("2022-01-01 12:00:00"); // 获取当前时间的年份 int year = now.year; // 获取当前时间的月份 int month = now.month; // 获取当前时间的日期 int day = now.day; // 获取当前时间的小时数 int hour = now.hour; // 获取当前时间的分钟数 int minute = now.minute; // 获取当前时间的秒数 int second = now.second; // 获取当前时间的毫秒数 int millisecond = now.millisecond;
datetime类还提供了一些常用的方法和属性,例如:
- datetime.adddays(double value):将当前datetime对象的日期加上指定的天数。
- datetime.addhours(double value):将当前datetime对象的时间加上指定的小时数。
- datetime.addminutes(double value):将当前datetime对象的时间加上指定的分钟数。
- datetime.addseconds(double value):将当前datetime对象的时间加上指定的秒数。
- datetime.year:获取当前datetime对象的年份。
- datetime.month:获取当前datetime对象的月份。
- datetime.day:获取当前datetime对象的日期。
- datetime.hour:获取当前datetime对象的小时数。
- datetime.minute:获取当前datetime对象的分钟数。
- datetime.second:获取当前datetime对象的秒数。
timespan类
timespan类表示时间间隔,可以用来计算两个日期之间的时间差。可以使用timespan.fromdays、timespan.fromhours、timespan.fromminutes、timespan.fromseconds等方法创建timespan对象。
// 创建一个表示1天的timespan对象 timespan oneday = timespan.fromdays(1); // 创建一个表示2小时的timespan对象 timespan twohours = timespan.fromhours(2); // 创建一个表示30分钟的timespan对象 timespan thirtyminutes = timespan.fromminutes(30); // 创建一个表示10秒的timespan对象 timespan tenseconds = timespan.fromseconds(10);
timespan类还提供了一些常用的方法和属性,例如:
- timespan.totaldays:获取timespan对象表示的总天数。
- timespan.totalhours:获取timespan对象表示的总小时数。
- timespan.totalminutes:获取timespan对象表示的总分钟数。
- timespan.totalseconds:获取timespan对象表示的总秒数。
datetimeoffset类
datetimeoffset类表示一个日期和时间,同时包含时区信息。可以使用datetimeoffset.now属性获取当前时间,也可以使用datetimeoffset.parse方法将字符串转换为datetimeoffset对象。
// 获取当前时间 datetimeoffset now = datetimeoffset.now // 将字符串转换为datetimeoffset对象 datetimeoffset datetimeoffset = datetimeoffset.parse("2022-01-01 12:00:00 +08:00");
datetimeoffset类还提供了一些常用的方法和属性,例如:
- datetimeoffset.tolocaltime():将当前datetimeoffset对象转换为本地时间。
- datetimeoffset.touniversaltime():将当前datetimeoffset对象转换为协调世界时(utc)时间。
静态类的封装
using system; namespace toolbox.datetimetool { public static class datetimeextend { /// /// 获取本日开始时间(0点0分0秒) /// /// /// public static datetime getdaystart(this datetime datetime) { return datetime.date; } /// /// 获取本日结束时间(23点59分59秒) /// /// /// public static datetime getdayend(this datetime datetime) { return datetime.date.adddays(1).addmilliseconds(-1); } /// /// 获取本周开始时间 /// /// /// public static datetime getweekstart(this datetime datetime) { return datetime.adddays(-(int)datetime.dayofweek + 1).getdaystart(); } /// /// 获取本周结束时间 /// /// /// public static datetime getweekend(this datetime datetime) { return datetime.adddays(7 - (int)datetime.dayofweek).getdayend(); } /// /// 获取本月开始时间 /// /// /// public static datetime getmonthstart(this datetime datetime) { return new datetime(datetime.year, datetime.month, 1, 0, 0, 0, 0); } /// /// 获取本月结束时间 /// /// /// public static datetime getmonthend(this datetime datetime) { return getmonthstart(datetime).addmonths(1).addmilliseconds(-1); } /// /// 获取本季度开始时间 /// /// /// public static datetime getseasonstart(this datetime datetime) { var time = datetime.addmonths(0 - ((datetime.month - 1) % 3)); return datetime.parse(time.adddays(-time.day + 1).tostring("yyyy/mm/dd 00:00:00")); } /// /// 获取本季度结束时间 /// /// /// public static datetime getseasonend(this datetime datetime) { var time = datetime.addmonths((3 - ((datetime.month - 1) % 3) - 1)); return datetime.parse(time.addmonths(1).adddays(-time.addmonths(1).day + 1).adddays(-1).tostring("yyyy/mm/dd 23:59:59")); } /// /// 获取本年开始时间 /// /// /// public static datetime getyearstart(this datetime datetime) { return datetime.parse(datetime.adddays(-datetime.dayofyear + 1).tostring("yyyy/mm/dd 00:00:00")); } /// /// 获取本年结束时间 /// /// /// public static datetime getyearend(this datetime datetime) { var time2 = datetime.addyears(1); return datetime.parse(time2.adddays(-time2.dayofyear).tostring("yyyy/mm/dd 23:59:59")); } /// /// 北京时间转换成unix时间戳(10位/秒) /// /// /// public static long beijingtimetounixtimestamp10(this datetime datetime) { return (long)(datetime - new datetime(1970, 1, 1, 8, 0, 0)).totalseconds; } /// /// 格林威治时间转换成unix时间戳(10位/秒) /// /// /// public static long utctimetounixtimestamp10(this datetime datetime) { return (long)(datetime - new datetime(1970, 1, 1, 0, 0, 0)).totalseconds; } /// /// 北京时间转换成unix时间戳(13位/毫秒) /// /// /// public static long beijingtimetounixtimestamp13(this datetime datetime) { return (long)(datetime - new datetime(1970, 1, 1, 8, 0, 0)).totalmilliseconds; } /// /// 格林威治时间转换成unix时间戳(13位/毫秒) /// /// /// public static long utctimetounixtimestamp13(this datetime datetime) { return (long)(datetime - new datetime(1970, 1, 1, 0, 0, 0)).totalmilliseconds; } /// /// 10位unix时间戳转换成北京时间 /// /// /// public static datetime unixtimestamp10tobeijingtime(this long unixtimestamp) { return new datetime(1970, 1, 1, 8, 0, 0).addseconds(unixtimestamp); } /// /// 10位unix时间戳转换成格林威治 /// /// /// public static datetime unixtimestamp10toutctime(this long unixtimestamp) { return new datetime(1970, 1, 1, 0, 0, 0).addseconds(unixtimestamp); } /// /// 13位unix时间戳转换成北京时间 /// /// /// public static datetime unixtimestamp13tobeijingtime(this long unixtimestamp) { return new datetime(1970, 1, 1, 8, 0, 0).addmilliseconds(unixtimestamp); } /// /// 13位unix时间戳转换成格林威治 /// /// /// public static datetime unixtimestamp13toutctime(this long unixtimestamp) { return new datetime(1970, 1, 1, 0, 0, 0).addmilliseconds(unixtimestamp); } /// /// 当前日期所在月份第一个指定星期几的日期 /// /// 给定日期 /// 星期几 /// 所对应的日期 public static datetime getfirstweekdayofmonth(this datetime date, dayofweek dayofweek) { var dt = date.getmonthstart(); while (dt.dayofweek != dayofweek) dt = dt.adddays(1); return dt; } /// /// 当前日期所在月份最后1个指定星期几的日期 /// /// 给定日期 /// 星期几 /// 所对应的日期 public static datetime getlastweekdayofmonth(this datetime date, dayofweek dayofweek) { var dt = date.getmonthend(); while (dt.dayofweek != dayofweek) dt = dt.adddays(-1); return dt; } /// /// 判断是否比指定之间早 /// /// /// /// public static bool isbefore(this datetime date, datetime other) { return date < other; } /// /// 判断是否比指定时间晚 /// /// /// /// public static bool isafter(this datetime date, datetime other) { return date > other; } /// /// 给定日期所在月份共有多少天 /// /// /// public static int getcountdaysofmonth(this datetime date) { return date.getmonthend().day; } /// /// 当前日期与给定日期是否是同一天 /// /// 当前日期 /// 给定日期 /// public static bool isdateequal(this datetime date, datetime datetocompare) { return date.date == datetocompare.date; } /// /// 是否是周未 /// /// /// public static bool isweekend(this datetime date) { return date.dayofweek == dayofweek.saturday || date.dayofweek == dayofweek.sunday; } /// /// 是否是工作日 /// /// /// public static bool isweekday(this datetime date) { return !date.isweekend(); } /// /// 判断是否为今天 /// /// /// public static bool istoday(this datetime date) { return date.date == datetime.now.date; } /// /// 判定公历闰年遵循的一般规律为:四年一闰,百年不闰,四百年再闰。 /// 公历闰年的精确计算方法:(按一回归年365天5小时48分45.5秒) /// 普通年能被4整除而不能被100整除的为闰年。 (如2004年就是闰年,1900年不是闰年) /// 世纪年能被400整除而不能被3200整除的为闰年。 (如2000年是闰年,3200年不是闰年) /// 对于数值很大的年份能整除3200,但同时又能整除172800则又是闰年。(如172800年是闰年,86400年不是闰年) /// 公元前闰年规则如下: /// 非整百年:年数除4余数为1是闰年,即公元前1、5、9……年; /// 整百年:年数除400余数为1是闰年,年数除3200余数为1,不是闰年,年数除172800余1又为闰年,即公元前401、801……年。 /// /// /// public static bool isleap(this datetime datetime) { var year = datetime.year; if ((year % 400 == 0 && year % 3200 != 0) || (year % 4 == 0 && year % 100 != 0) || (year % 3200 == 0 && year % 172800 == 0)) return true; else return false; } /// /// 获取当前年天数 /// /// /// public static int getdaysbyyear(this datetime datetime) { return (new datetime(datetime.year + 1, 1, 1) - new datetime(datetime.year, 1, 1)).days; } /// /// 获取当前年天数 /// /// /// public static int getweekcountbyyear(this datetime datetime) { //找到今年的第一天是周几 int firstweekend = convert.toint32(datetime.parse(datetime.year + "-1-1").dayofweek); //获取第一周的差额,如果是周日,则firstweekend为0,第一周也就是从周天开始的。 int weekday = firstweekend == 0 ? 1 : (7 - firstweekend + 1); //获取今天是一年当中的第几天 int currentday = datetime.dayofyear; //(今天 减去 第一周周末)/7 等于 距第一周有多少周 再加上第一周的1 就是今天是今年的第几周了 // 刚好考虑了惟一的特殊情况就是,今天刚好在第一周内,那么距第一周就是0 再加上第一周的1 最后还是1 int current_week = convert.toint32(math.ceiling((currentday - weekday) / 7.0)) + 1; return current_week; } } }