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;
      }

  }
}
相关文章