您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496net:时间间隔,Date对象详解

新葡亰496net:时间间隔,Date对象详解

发布时间:2019-08-23 12:59编辑:奥门新萄京娱乐场浏览(87)

    Monthly由来

    最近在做关于智能财税的项目,大量用到了账期相关的数据操作。项目已有两年历史了,对于账期数据,前辈们用的是DateTime数据类型,即每个月的最后一天就是账期。而用DateTime来表达账期数据,确实让我人很困惑:

    1. 概念不统一:
      DateTime是时间类型,而账期只跟年月相关,DateTime用在这里确实有点杀鸡用了宰牛刀,而且给人的理解和沟通造成了额外的误解。
    2. 格式不统一:
      为了在数据传输和存储中达到数据的统一性,需要大量的字符串与日期的转换、日期格式的转换。
    3. 浪费性能:
      DateTime的精确度是可以到毫秒级的,而我们的账期数据只需要精确到月,如:2018年1月账期。 所以DateTime是很影响运算性能和存储空间的。
    4. 操作异常:
      由于账期是取月末日期,所以对每次接收了账期参数都要取月末值,以确保数据的准确性。而在实际开发中,任何一个疏忽都会引发表达偏差。

    TimeSpan 结构  表示一个时间间隔。

    JavaScript Date对象详解,javascriptdate

    本篇主要介绍 Date 日期和时间对象的操作,具体内容如下

    目录

    1. 介绍:阐述 Date 对象。

    2. 新葡亰496net:时间间隔,Date对象详解。构造函数:介绍 Date 对象的构造函数new Date()几种方式。

    3. 实例方法:介绍 Date 对象的get、set等实例方法。

    4. 静态方法:介绍 Date 对象的静态方法:Date.now()、 Date.parse()等。

    5. 实际操作:介绍 Date 对象的一些示例:获取倒计时、比较2个Date对象的大小等等。

    一. 介绍 1.1 说明

    Date对象,是操作日期和时间的对象。Date对象对日期和时间的操作只能通过方法。

    1.2 属性

    无;Date对象对日期和时间的操作只能通过方法。

    二. 构造函数 2.1 new Date() :返回当前的本地日期和时间

    参数:无

    返回值:

    {Date} 返回一个表示本地日期和时间的Date对象。

    示例:

    var dt = new Date();
    console.log(dt); // => 返回一个表示本地日期和时间的Date对象
    

    2.2 new Date(milliseconds) :把毫秒数转换为Date对象

    参数:

    ①milliseconds {int} :毫秒数;表示从'1970/01/01 00:00:00'为起点,开始叠加的毫秒数。

    注意:起点的时分秒还要加上当前所在的时区,北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00'

    返回值:

    {Date} 返回一个叠加后的Date对象。

    示例:

    var dt = new Date(1000 * 60 * 1); // 前进1分钟的毫秒数
    console.log(dt); // => {Date}:1970/01/01 08:01:00
    dt = new Date(-1000 * 60 * 1); // 倒退1分钟的毫秒数
    console.log(dt); // => {Date}:1970/01/01 07:59:00
    

    2.3 new Date(dateStr) :把字符串转换为Date对象

    参数:

    ①dateStr {string} :可转换为Date对象的字符串(可省略时间);字符串的格式主要有两种:

    1) yyyy/MM/dd HH:mm:ss (推荐):若省略时间,返回的Date对象的时间为 00:00:00。

    2) yyyy-MM-dd HH:mm:ss :若省略时间,返回的Date对象的时间为 08:00:00(加上本地时区)。若不省略时间,此字符串在IE中会转换失败!

    返回值:

    {Date} 返回一个转换后的Date对象。

    示例:

    var dt = new Date('2014/12/25'); // yyyy/MM/dd
    console.log(dt); // => {Date}:2014/12/25 00:00:00
    dt = new Date('2014/12/25 12:00:00'); // yyyy/MM/dd HH:mm:ss
    console.log(dt); // => {Date}:2014/12/25 12:00:00
    
    dt = new Date('2014-12-25'); // yyyy-MM-dd
    console.log(dt); // => {Date}:2014-12-25 08:00:00 (加上了东8区的时区)
    dt = new Date('2014-12-25 12:00:00'); // yyyy-MM-dd HH:mm:ss (注意:此转换方式在IE中会报错!)
    console.log(dt); // => {Date}:2014-12-25 12:00:00
    

    2.4 new Date(year, month, opt_day, opt_hours, opt_minutes, opt_seconds, opt_milliseconds) :把年月日、时分秒转换为Date对象

    参数:

    ①year {int} :年份;4位数字。如:1999、2014

    ②month {int} :月份;2位数字。从0开始计算,0表示1月份、11表示12月份。

    ③opt_day {int} 可选:号; 2位数字;从1开始计算,1表示1号。

    ④opt_hours {int} 可选:时;2位数字;取值0~23。

    ⑤opt_minutes {int} 可选:分;2位数字;取值0~59。

    ⑥opt_seconds {int} 可选:秒;2未数字;取值0~59。

    ⑦opt_新葡亰496net:时间间隔,Date对象详解。milliseconds {int} 可选:毫秒;取值0~999。

    返回值:

    {Date} 返回一个转换后的Date对象。

    示例:

    var dt = new Date(2014, 11); // 2014年12月(这里输入的月份数字为11)
    console.log(dt); // => {Date}:2014/12/01 00:00:00
    dt = new Date(2014, 11, 25); // 2014年12月25日
    console.log(dt); // => {Date}:2014/12/25 00:00:00
    dt = new Date(2014, 11, 25, 15, 30, 40); // 2014年12月25日 15点30分40秒
    console.log(dt); // => {Date}:2014/12/25 15:30:40
    dt = new Date(2014, 12, 25); // 2014年13月25日(这里输入的月份数字为12,表示第13个月,跳转到第二年的1月)
    console.log(dt); // => {Date}:2015/01/25
    

    三. 实例方法   Date对象的实例方法主要分为2种形式:本地时间和UTC时间。同一个方法,一般都会有此2种时间格式操作(方法名带UTC的,就是操作UTC时间),这里主要介绍对本地时间的操作。 

    3.1 get方法

    3.1.1 getFullYear() :返回Date对象的年份值;4位年份。

    3.1.2 getMonth() :返回Date对象的月份值。从0开始,所以真实月份=返回值 1 。

    3.1.3 getDate() :返回Date对象的月份中的日期值;值的范围1~31 。

    3.1.4 getHours() :返回Date对象的小时值。

    3.1.5 getMinutes() :返回Date对象的分钟值。

    3.1.6 getSeconds() :返回Date对象的秒数值。

    3.1.7 getMilliseconds() :返回Date对象的毫秒值。

    3.1.8 getDay() :返回Date对象的一周中的星期值;0为星期天,1为星期一、2为星期二,依此类推

    3.1.9 getTime() :返回Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00') 。

    示例:

    dt.getFullYear(); // => 2014:年
    dt.getMonth(); // => 11:月;实际为12月份(月份从0开始计算)
    dt.getDate(); // => 25:日
    dt.getHours(); // => 15:时
    dt.getMinutes(); // => 30:分
    dt.getSeconds(); // => 40:秒
    dt.getMilliseconds(); // => 333:毫秒
    dt.getDay(); // => 4:星期几的值
    dt.getTime(); // => 1419492640333 :返回Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00')
    

    3.2 set方法

    3.2.1 setFullYear(year, opt_month, opt_date) :设置Date对象的年份值;4位年份。

    3.2.2 setMonth(month, opt_date) :设置Date对象的月份值。0表示1月,11表示12月。

    3.2.3 setDate(date) :设置Date对象的月份中的日期值;值的范围1~31 。

    3.2.4 setHours(hour, opt_min, opt_sec, opt_msec) :设置Date对象的小时值。

    3.2.5 setMinutes(min, opt_sec, opt_msec) :设置Date对象的分钟值。

    3.2.6 setSeconds(sec, opt_msec) :设置Date对象的秒数值。

    3.2.7 setMilliseconds(msec) :设置Date对象的毫秒值。

    示例:

    var dt = new Date();
    dt.setFullYear(2014); // => 2014:年
    dt.setMonth(11); // => 11:月;实际为12月份(月份从0开始计算)
    dt.setDate(25); // => 25:日
    dt.setHours(15); // => 15:时
    dt.setMinutes(30); // => 30:分
    dt.setSeconds(40); // => 40:秒
    dt.setMilliseconds(333); // => 333:毫秒
    console.log(dt); // => 2014年12月25日 15点30分40秒 333毫秒
    

    3.3 其他方法

    3.3.1 toString() :将Date转换为一个'年月日 时分秒'字符串

    3.3.2 toLocaleString() :将Date转换为一个'年月日 时分秒'的本地格式字符串

    3.3.3 toDateString() :将Date转换为一个'年月日'字符串

    3.3.4 toLocaleDateString() :将Date转换为一个'年月日'的本地格式字符串

    3.3.5 toTimeString() :将Date转换为一个'时分秒'字符串

    3.3.6 toLocaleTimeString() :将Date转换为一个'时分秒'的本地格式字符串

    3.3.7 valueOf() :与getTime()一样, 返回Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00')

    示例:

    var dt = new Date();
    console.log(dt.toString()); // => Tue Dec 23 2014 22:56:11 GMT 0800 (中国标准时间) :将Date转换为一个'年月日 时分秒'字符串
    console.log(dt.toLocaleString()); // => 2014年12月23日 下午10:56:11 :将Date转换为一个'年月日 时分秒'的本地格式字符串
    
    console.log(dt.toDateString()); // => Tue Dec 23 2014 :将Date转换为一个'年月日'字符串
    console.log(dt.toLocaleDateString()); // => 2014年12月23日 :将Date转换为一个'年月日'的本地格式字符串
    
    console.log(dt.toTimeString()); // => 22:56:11 GMT 0800 (中国标准时间) :将Date转换为一个'时分秒'字符串
    console.log(dt.toLocaleTimeString()); // => 下午10:56:11 :将Date转换为一个'时分秒'的本地格式字符串
    
    console.log(dt.valueOf()); // => 返回Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00')
    

    四. 静态方法 4.1 Date.now()

    说明:返回当前日期和时间的Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00')

    参数:无

    返回值:

    {int} :当前时间与起始时间之间的毫秒数。

    示例:

    console.log(Date.now()); // => 1419431519276
    

    4.2 Date.parse(dateStr)

    说明:把字符串转换为Date对象 ,然后返回此Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00')

    参数:

    ①dateStr {string} :可转换为Date对象的字符串(可省略时间);字符串的格式主要有两种:

    1) yyyy/MM/dd HH:mm:ss (推荐):若省略时间,返回的Date对象的时间为 00:00:00。

    2) yyyy-MM-dd HH:mm:ss :若省略时间,返回的Date对象的时间为 08:00:00(加上本地时区)。若不省略时间,此字符串在IE中返回NaN(非数字)!

    返回值:

    {int} 返回转换后的Date对象与起始时间之间的毫秒数。

    示例:

    console.log(Date.parse('2014/12/25 12:00:00')); // => 1419480000000
    console.log(Date.parse('2014-12-25 12:00:00')); // => 1419480000000 (注意:此转换方式在IE中返回NaN!)
    

    五. 实际操作
    5.1 C#的DateTime类型转换为Js的Date对象

    说明:C#的DateTime类型通过Json序列化返回给前台的格式为:"/Date(1419492640000)/" 。中间的数字,表示DateTime的值与起始时间之间的毫秒数。

    示例:

    后台代码:简单的ashx

    public void ProcessRequest (HttpContext context) {
     System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
     DateTime dt = DateTime.Parse("2014-12-25 15:30:40");
     string rs = js.Serialize(dt); // 序列化成Json
     context.Response.ContentType = "text/plain";
     context.Response.Write(rs);
    }
    

    前台代码:

    var dateTimeJsonStr = '/Date(1419492640000)/'; // C# DateTime类型转换的Json格式
    var msecStr = dateTimeJsonStr.toString().replace(//Date(([-]?d ))//gi, "$1"); // => '1419492640000' :通过正则替换,获取毫秒字符串
    var msesInt = Number.parseInt(msecStr); // 毫秒字符串转换成数值
    var dt = new Date(msesInt); // 初始化Date对象
    console.log(dt.toLocaleString()); // => 2014年12月25日 下午3:30:40
    

    5.2  获取倒计时

    说明:计算当前时间离目的时间相差多少天时分。

    示例:

    /**
    * 返回倒计时
    * @param dt {Date}:目的Date对象
    * @return {Strin} :返回倒计时:X天X时X分
    */
    function getDownTime(dt) {
     // 1.获取倒计时
     var intervalMsec = dt - Date.now(); // 目的时间减去现在的时间,获取两者相差的毫秒数
     var intervalSec = intervalMsec / 1000; // 转换成秒数
     var day = parseInt(intervalSec / 3600 / 24); // 天数
     var hour = parseInt((intervalSec - day * 24 * 3600) / 3600); // 小时
     var min = parseInt((intervalSec - day * 24 * 3600 - hour * 3600) / 60); // 分钟
    
     // 2.若相差的毫秒小于0 ,表示目的时间小于当前时间,这时的取的值都是负的:-X天-时-分,显示时,只显示天数前面为负的就行。
     if (intervalMsec < 0) {
      hour = 0 - hour;
      min = 0 - min;
     }
    
     // 3.拼接字符串并返回
     var rs = day   '天'   hour   '时'   min   '分';
     return rs;
    }
    
    // 当前时间:2014/12/28 13:26
    console.log(getDownTime(new Date('2015/06/01'))); // => 154天10时33分
    console.log(getDownTime(new Date('2014/01/01'))); // => -361天13时26分
    

    5.3 比较2个Date对象的大小

    说明:可以对比2者的与起始时间的毫秒数,来区分大小。

    示例:

    var dt1 = new Date('2015/12/01');
    var dt2 = new Date('2015/12/25');
    console.log(dt1 > dt2); // => false
    

    以上就是本文的全部内容,希望对大家的学习有所帮助。

    TimeSpan 结构  表示一个时间间隔。

      本篇主要介绍 Date 日期和时间对象的操作。

    Monthly简介

    Monthly是一个跟Datetime类似的,与月份相关的数据类型,适用于表达年月数据,如账单、账期、月刊等信息。

    命名空间:System 程序集:mscorlib(在 mscorlib.dll 中)

    您可能感兴趣的文章:

    • JavaScript中的toLocaleDateString()方法使用简介
    • JavaScript中的toDateString()方法使用详解
    • js表格排序实例分析(支持int,float,date,string四种数据类型)
    • Javascript中string转date示例代码
    • 详解JS中Array对象扩展与String对象扩展
    • JavaScript的Number对象的toString()方法
    • 每天一篇javascript学习小结(String对象)
    • 3种js实现string的substring方法
    • 浅析js中substring和substr的方法
    • 详解JavaScript中的Unescape()和String() 函数
    • 简单谈谈javascript Date类型
    • js模仿php中strtotime()与date()函数实现方法
    • JS简单实现String转Date的方法

    Date对象详解,javascriptdate 本篇主要介绍 Date 日期和时间对象的操作,具体内容如下 目录 1. 介绍:阐述 Date 对象。 2. 构造函数:介...

    命名空间:System 程序集:mscorlib(在 mscorlib.dll 中)

    目录

    1. 介绍:阐述 Date 对象。

    2. 构造函数:介绍 Date 对象的构造函数new Date()几种方式。

    3. 实例方法:介绍 Date 对象的get、set等实例方法。

    4. 静态方法:介绍 Date 对象的静态方法:Date.now()、 Date.parse()等。

    5. 实际操作:介绍 Date 对象的一些示例:获取倒计时、比较2个Date对象的大小等等。

     

    Monthly源码

    using System.Collections.Generic;
    using System.Runtime.InteropServices;
    using System.Text.RegularExpressions;
    
    namespace System
    {
        /// <summary>
        /// 与月份相关的对象,如账单、账期、月刊、月报等
        /// </summary>
        [Serializable]
        [StructLayout(LayoutKind.Auto)]
        public struct Monthly : IComparable<Monthly>, IEquatable<Monthly>
        {
            private int _year;
            private int _month;
    
            #region Property
            /// <summary>
            ///  获取当前实例的年
            /// </summary>
            public int Year => _year;
    
            /// <summary>
            ///  获取当前实例的月
            /// </summary>
            public int Month => _month;
    
            /// <summary>
            /// 获取当前实例的年月标记值,如2018年1月记为 : 201801
            /// </summary>
            public int Dot => this._year * 100   this._month;
    
            /// <summary>
            /// 获取当前实例从公元零年一月开始的月份累计值
            /// </summary>
            public int Tickes => this._year * 12   this._month;
    
            /// <summary>
            ///  获取当前实例所在的季度
            /// </summary>
            public int Quarter => (this._month - 1) / 3   1;
            #endregion
    
            #region Ctor
            /// <summary>
            ///  以指定的年和月初始化Monthly实例。
            /// </summary>
            /// <param name="year"> 年(0 到 9999)</param>
            /// <param name="month"> 月(1 到 12)</param>
            public Monthly(int year, int month)
            {
                CheckYear(year);
                CheckMonth(month);
                this._year = year;
                this._month = month;
            }
    
            /// <summary>
            /// 获取以当前时间点为依据的新实例
            /// </summary>
            public static Monthly Current => new Monthly() { _year = DateTime.Now.Year, _month = DateTime.Now.Month };
    
            /// <summary>
            /// 获取当前时间点的上月为依据的新实例
            /// </summary>
            public Monthly Previous => Monthly.fromTickes(this.Tickes - 1);
    
            /// <summary>
            /// 获取当前时间点的下月为依据的新实例
            /// </summary>
            public Monthly Next => Monthly.fromTickes(this.Tickes   1);
    
            /// <summary>
            /// 获取当前年份的一月为依据的新实例  
            /// </summary>
            public Monthly First => new Monthly() { _year = this._year, _month = 1 };
    
            /// <summary>
            /// 获取当前年份的十二月为依据的新实例
            /// </summary>
            public Monthly Last => new Monthly() { _year = this._year, _month = 12 };
    
            /// <summary>
            /// 获取Monthly的最小值实例
            /// </summary>
            public static Monthly MinValue => new Monthly() { _year = 0, _month = 1 };
    
            /// <summary>
            /// 获取Monthly的最大值实例
            /// </summary>
            public static Monthly MaxValue => new Monthly() { _year = 9999, _month = 12 };
            #endregion
    
            #region Method
            private static int yearOfDot(int dot) => dot / 100;
    
            private static int monthOfDot(int dot) => dot % 100;
    
            /// <summary>
            /// 获取当前实例的年月标记值,如2018年1月记为 : 201801
            /// </summary>
            /// <returns></returns>
            public int ToDot() => this.Dot;
    
            /// <summary>
            /// 以当前实例与years的和值为依据创建一个新实例
            /// </summary>
            public Monthly AddYears(int years) => Monthly.FromTickes(this.Tickes   years * 12);
    
            /// <summary>
            /// 以当前实例与months的和值为依据创建一个新实例
            /// </summary>
            public Monthly AddMonths(int months) => Monthly.FromTickes(this.Tickes   months);
    
            /// <summary>
            /// 判断当前实例的值与给定实例的值是否相等
            /// </summary>
            public bool Equals(Monthly other) => this.Tickes == other.Tickes;
    
            /// <summary>
            /// 获取当前实例与给定实例的月份差值
            /// </summary>
            public int SpanMonths(Monthly other) => this - other;
    
            /// <summary>
            /// 获取当前实例与DateTime实例的月份差值
            /// </summary>
            public int SpanMonths(DateTime date) => this.Tickes - date.Year * 12 - date.Month;
    
            /// <summary>
            /// 获取当前实例与给定实例的大小比较的结果标识
            /// </summary>
            /// <param name="other"></param>
            /// <returns>-1:小于other实例值 ; 0 等于other实例值 ; 1:大于other实例值</returns>
            public int CompareTo(Monthly other)
            {
                if (this.Tickes < other.Tickes) return -1;
                if (this.Tickes > other.Tickes) return 1;
                else return 0;
            }
    
            /// <summary>
            /// 以年月标记值创建一个Monthly新实例
            /// </summary>
            /// <param name="dot">格式:201801</param>
            /// <returns></returns>
            public static Monthly FromDot(int dot)
            {
                var year = yearOfDot(dot);
                var month = monthOfDot(dot);
                if (year < 0 || year > 9999 || month < 1 || month > 12)
                    throw new ArgumentOutOfRangeException("dot", dot, "Please enter correct dot format such as '201801'.");
    
                return new Monthly
                {
                    _year = yearOfDot(dot),
                    _month = monthOfDot(dot)
                };
            }
    
            private static Monthly fromTickes(int tickes)
            {
                return new Monthly
                {
                    _year = (tickes - 1) / 12,
                    _month = tickes % 12 == 0 ? 12 : tickes % 12
                };
            }
    
            /// <summary>
            /// 以年月累计值创建一个Monthly新实例
            /// </summary>
            /// <param name="tickes">以公元零年一月为起点的月份计数值(1-120000)</param>
            public static Monthly FromTickes(int tickes)
            {
                if (tickes < 1 || tickes > 120000)
                    throw new ArgumentOutOfRangeException("tickes", tickes, "The tickes must beteen 1 and 120000 .");
                return fromTickes(tickes);
            }
    
            /// <summary>
            /// 以DateTime实例创建一个Monthly新实例
            /// </summary>
            public static Monthly FromDate(DateTime time) => new Monthly() { _year = time.Year, _month = time.Month };
    
            /// <summary>
            /// 以诸如"2018/01"格式的字符串创建一个Monthly新实例
            /// </summary>
            /// <param name="s">"2018/01"格式的字符串</param>
            /// <param name="spliter">分隔符</param>
            public static Monthly FromString(string s)
            {
                if (string.IsNullOrEmpty(s))
                    throw new Exception("The parameter cannot be null or empty.");
    
                var nums = Regex.Matches(s, "[0-9] ");
                if (nums.Count == 0)
                    throw new Exception("Please give the correct parameters, such as '2018/01' .");
    
                if (nums.Count == 1)
                    return new Monthly(0, Convert.ToInt32(nums[0].ToString().TrimStart('0')));
                else
                    return new Monthly(Convert.ToInt32(nums[0].ToString().TrimStart('0')), Convert.ToInt32(nums[1].ToString().TrimStart('0')));
            }
    
            /// <summary>
            /// 获取一段时间内的Monthly数轴(包含开始与结束月份)
            /// </summary>
            /// <param name="from">开始月份</param>
            /// <param name="to">结束月份</param>
            /// <returns></returns>
            public static List<Monthly> Axis(Monthly from, Monthly to)
            {
                var result = new List<Monthly>();
                var span = from - to;
                var len = (span ^ (span >> 31)) - (span >> 31)   1;
                for (int i = 0; i < len; i  )
                {
                    if (span > 0) result.Add(from - i);
                    else result.Add(from   i);
                }
                return result;
            }
    
            /// <summary>
            /// 获取给定时间段内的Monthly集合(包含开始与结束月份)
            /// </summary>
            /// <param name="from">开始月份</param>
            /// <param name="to">结束月份</param>
            /// <returns></returns>
            public static List<Monthly> Axis(int from, int to)
            {
                return Axis(Monthly.FromDot(from), Monthly.FromDot(to));
            }
    
            /// <summary>
            /// 检查year的合法性
            /// </summary>
            private static void CheckYear(int year)
            {
                if (year < 0 || year > 9999)
                    throw new ArgumentOutOfRangeException("year", year, "The year must beteen 0 and 9999 .");
            }
    
            /// <summary>
            /// 检查month的合法性
            /// </summary>
            private static void CheckMonth(int month)
            {
                if (month < 1 || month > 12)
                    throw new ArgumentOutOfRangeException("month", month, "The month must beteen 1 and 12 .");
            }
            #endregion
    
            #region Operator
            /// <summary>
            /// 以给定实例与months的和值创建一个新实例
            /// </summary>
            /// <param name="months">月分数</param>
            public static Monthly operator  (Monthly m, int months) => FromTickes(m.Tickes   months);
    
            /// <summary>
            /// 以给定实例与months的差值创建一个新实例
            /// </summary>
            /// <param name="months">月分数</param>
            public static Monthly operator -(Monthly m, int months) => FromTickes(m.Tickes - months);
    
            /// <summary>
            /// 获取当前实例与给定实例的月份差值
            /// </summary>
            public static int operator -(Monthly m1, Monthly m2) => m1.Tickes - m2.Tickes;
    
            /// <summary>
            ///获取当前实例与DateTime实例的月份差值
            /// </summary>
            public static int operator -(Monthly m, DateTime d) => m.SpanMonths(d);
    
            public static Monthly operator   (Monthly m) => m   1;
    
            public static Monthly operator --(Monthly m) => m - 1;
    
            /// <summary>
            ///判断m1是否等于m2
            /// </summary>
            public static bool operator ==(Monthly m1, Monthly m2) => m1.Tickes == m2.Tickes;
    
            /// <summary>
            /// 判断m1是否不等于m2
            /// </summary>
            public static bool operator !=(Monthly m1, Monthly m2) => m1.Tickes != m2.Tickes;
    
            /// <summary>
            /// 判断m1是否小于m2
            /// </summary>
            public static bool operator <(Monthly m1, Monthly m2) => m1.Tickes < m2.Tickes;
    
            /// <summary>
            /// 判断m1是否大于m2
            /// </summary>
            public static bool operator >(Monthly m1, Monthly m2)
            {
                return m1.Tickes > m2.Tickes; ;
            }
    
            /// <summary>
            /// 判断m1是否小于等于m2
            /// </summary>
            public static bool operator <=(Monthly m1, Monthly m2)
            {
                return m1.Tickes <= m2.Tickes; ;
            }
    
            /// <summary>
            /// 判断m1是否大于等于m2
            /// </summary>
            public static bool operator >=(Monthly m1, Monthly m2)
            {
                return m1.Tickes >= m2.Tickes; ;
            }
    
            /// <summary>
            /// 以年月标识的Monthly实例
            /// </summary>
            /// <param name="dot">格式:201801</param>
            public static implicit operator Monthly(int dot)
            {
                return Monthly.FromDot(dot);
            }
            #endregion
    
            #region Override
            /// <summary>
            /// 获取包含"Y、y、M、m"字符格式的自定义Monthly字符串
            /// </summary>
            /// <param name="format">
            /// 如:yyyy/mm ; yy/mm ; yyyy年mm月 ;YYYY-Mm...
            /// 不区分大小写
            /// </param>
            /// <returns></returns>
            public string ToString(string format = "yyyy/mm")
            {
                return Format(this, format);
            }
    
            /// <summary>
            /// 判断当前实例的值与给定实例的转换值是否相等
            /// </summary>
            public override bool Equals(object obj)
            {
                if (obj is null) throw new ArgumentNullException("obj", "The parameter cannot be null.");
                if (obj is Monthly) return this == (Monthly)obj;
                if (obj is DateTime) return this == Monthly.FromDate((DateTime)obj);
                throw new ArgumentException("The parameter must be System.DateTime type or System.Monthly type .", "obj");
            }
    
            public override int GetHashCode()
            {
                Int64 ticks = Tickes;
                return unchecked((int)ticks) ^ (int)(ticks >> 32);
            }
    
            private static string Format(Monthly m, string format)
            {
                string _y = m.Year.ToString();
                string _m = m.Month.ToString();
                format = format.ToLower();
                if (!(format.Contains("yyyy") || format.Contains("yyyy")) && !(format.Contains("mm") || format.Contains("m")))
                    throw new ArgumentException("The format expression error. ", nameof(format));
                if (format.Contains("yyyy"))
                    format = format.Replace("yyyy", m.Year < 10 ? $"0{_y}" : _y);
                else if (format.Contains("yy"))
                    format = format.Replace("yy", m.Year < 10 ? $"0{_y}" : _y.PadLeft(4, '0').Substring(2));
                if (format.Contains("mm"))
                    format = format.Replace("mm", m.Month < 10 ? $"0{_m}" : _m);
                else if (format.Contains("m"))
                    format = format.Replace("m", _m.TrimStart('0'));
                return format;
            }
            #endregion
        }
    }
    

    说明: 1.DateTime值类型代表了一个从公元0001年1月1日0点0分0秒到公元9999年12月31日23点59分59秒之间的具体日期时刻。因此,你可以用DateTime值类型来描述任何在想象范围之内的时间。TimeSpan值包含了许多属性与方法,用于访问或处理一个TimeSpan值,

    说明: 1.DateTime值类型代表了一个从公元0001年1月1日0点0分0秒到公元9999年12月31日23点59分59秒之间的具体日期时刻。因此,你可以用DateTime值类型来描述任何在想象范围之内的时间。TimeSpan值包含了许多属性与方法,用于访问或处理一个TimeSpan值,

    1. 介绍

    测试

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace Pilipa.Utility.Test
    {
        [TestClass]
        public class MonthlyTest
        {
            [TestMethod]
            public void TestProps()
            {
                var tar = DateTime.Now;
                Monthly plan = Monthly.FromDate(tar);
    
                Assert.AreEqual(Monthly.Current, new Monthly(tar.Year, tar.Month));
    
                Assert.AreEqual(plan.Year, tar.Year);
                Assert.AreEqual(plan.Month, tar.Month);
                Assert.AreEqual(plan.Dot, tar.Year * 100   tar.Month);
                Assert.AreEqual(plan.Tickes, tar.Year * 12   tar.Month);
    
                Assert.AreEqual(plan.First.ToDot(), tar.Year * 100   1);
                Assert.AreEqual(plan.Last.ToDot(), tar.Year * 100   12);
    
    
                Assert.AreEqual(plan.First.Previous.ToDot(), tar.AddYears(-1).Year * 100   12);
                Assert.AreEqual(plan.Last.Next.ToDot(), tar.AddYears(1).Year * 100   1);
    
                Assert.AreEqual(plan.Quarter, GetQuarter(tar.Month));
    
                Assert.AreEqual(Monthly.MinValue, new Monthly(0, 1));
                Assert.AreEqual(Monthly.MaxValue, new Monthly(9999, 12));
            }
    
            private int GetQuarter(int q)
            {
                if (new System.Collections.Generic.List<int>() { 1, 2, 3 }.Contains(q)) return 1;
                if (new System.Collections.Generic.List<int>() { 4, 5, 6 }.Contains(q)) return 2;
                if (new System.Collections.Generic.List<int>() { 7, 8, 9 }.Contains(q)) return 3;
                if (new System.Collections.Generic.List<int>() { 10, 11, 12 }.Contains(q)) return 4;
                return 0;
            }
    
    
            [TestMethod]
            public void TestMethods()
            {
                Monthly plan = 201801;
                var tar = new DateTime(2018, 1, 1);
                var tip = false;
    
                //Dot
                Assert.AreEqual(new Monthly(0, 11), 11);
                Assert.AreEqual(new Monthly(1, 1), 101);
                Assert.AreEqual(new Monthly(100, 12), 10012);
                Assert.AreEqual(new Monthly(2018, 12), 201812);
    
                //Tickes
                Assert.AreEqual(((Monthly)101).Tickes, 13);
                Assert.AreEqual(((Monthly)201811).Tickes, 2018 * 12   11);
    
                //加月
                Assert.AreEqual(plan.AddMonths(-1), 201712);
                Assert.AreEqual(plan.AddMonths(-23), 201602);
                Assert.AreEqual(plan.AddMonths(22), 201911);
    
                //加月(随机)
                for (int i = 0; i < 100; i  )
                {
                    var rd = new Random(Guid.NewGuid().GetHashCode()).Next(100);
                    Assert.AreEqual(plan.AddMonths(rd), Monthly.FromDate(tar.AddMonths(rd)));
                    Assert.AreEqual(plan.AddMonths(rd).Dot, tar.AddMonths(rd).Year * 100   tar.AddMonths(rd).Month);
                }
    
                //加年
                Assert.IsTrue(plan.AddYears(6) == 202401);
                Assert.IsTrue(plan.AddYears(-18) == 200001);
    
                //加年(异常)
                try { var m = Monthly.Current.AddYears(-3000); }
                catch (Exception e) { if (e.Message.Contains("beteen 1 and 120000")) { tip = true; } }
                Assert.IsTrue(tip);
    
                //月份差
                Assert.AreEqual(plan.SpanMonths(201711), 2);
                Assert.AreEqual(plan.SpanMonths(201902), -13);
    
                //比较大小
                Assert.AreEqual(plan.CompareTo(201801), 0);
                Assert.AreEqual(plan.CompareTo(201701), 1);
                Assert.AreEqual(plan.CompareTo(202001), -1);
    
                //构造
                Assert.AreEqual(Monthly.FromDot(3), 3);
                Assert.AreEqual(Monthly.FromTickes(13), 101);
                Assert.AreEqual(Monthly.FromDate(new DateTime(2018, 12, 12)), 201812);
                Assert.AreEqual(Monthly.FromString("2018/01"), 201801);
                Assert.AreEqual(Monthly.FromString("2018年01月"), 201801);
                Assert.AreEqual(Monthly.FromString("2018@01/01"), 201801);
                Assert.AreEqual(Monthly.FromString((new DateTime(2018, 1, 1)).ToString()), 201801);
                Assert.AreEqual(Monthly.FromString("3"), 3);
    
                //月份轴
                var axis = Monthly.Axis(201711, 201901);
                Assert.IsTrue(axis.Count == 15);
                Assert.AreEqual(axis[0], 201711);
                Assert.AreEqual(axis[3], 201802);
                Assert.AreEqual(axis[14], 201901);
    
                axis = Monthly.Axis(201812, 201712);
                Assert.IsTrue(axis.Count == 13);
                Assert.AreEqual(axis[0], 201812);
                Assert.AreEqual(axis[12], 201712);
    
                //异常
                tip = false;
                try { Monthly m = 201800; }
                catch (Exception e) { if (e.Message.Contains("correct dot format")) { tip = true; } }  //dot format
                Assert.IsTrue(tip);
    
                tip = false;
                try { Monthly m = Monthly.FromDot(13); }
                catch (Exception e) { if (e.Message.Contains("correct dot format")) { tip = true; } }  //13月
                Assert.IsTrue(tip);
    
                tip = false;
                try { Monthly m = Monthly.FromTickes(999999); }
                catch (Exception e) { if (e.Message.Contains("must beteen 1 and 120000")) { tip = true; } }  //越界
                Assert.IsTrue(tip);
    
                tip = false;
                try { Monthly m = Monthly.FromString(null); }
                catch (Exception e) { if (e.Message.Contains("null or empty")) { tip = true; } }  //IsNullOrEmpty
                Assert.IsTrue(tip);
    
                tip = false;
                try { Monthly m = Monthly.FromString("abc"); }
                catch (Exception e) { if (e.Message.Contains("parameters")) { tip = true; } }  //格式错误
                Assert.IsTrue(tip);
    
                tip = false;
                try { Monthly m = Monthly.FromString("88"); }
                catch (Exception e) { if (e.Message.Contains("must beteen")) { tip = true; } }  //越界
                Assert.IsTrue(tip);
            }
    
            [TestMethod]
            public void TestOps()
            {
                Monthly plan = 201801;
                var tar = Monthly.FromString("2018.01");
    
                Assert.AreEqual(plan   12, 201901);
                Assert.AreEqual(plan - 13, 201612);
    
                Assert.AreEqual(plan - (Monthly)201701, 12);
                Assert.AreEqual(plan - (new DateTime(2017, 12, 12)), 1);
    
                Assert.AreEqual(--plan, 201712);
                Assert.AreEqual(  plan, 201801);
    
                Assert.IsTrue(plan == Monthly.FromDot(201801));
                Assert.IsTrue(plan != Monthly.FromDot(201802));
    
                Assert.IsTrue(plan >= Monthly.FromDot(201801));
                Assert.IsTrue(plan < Monthly.FromDot(201803));
            }
    
            [TestMethod]
            public void TestOvr()
            {
                Monthly plan = 201801;
                var tar = Monthly.FromString("2018.01");
    
                //哈希码(相同dot具有相同的哈希码)
                Assert.AreEqual(plan.GetHashCode(), tar.GetHashCode());
                tar  ;
                Assert.AreNotEqual(plan.GetHashCode(), tar.GetHashCode());
    
                //格式化
                Assert.AreEqual(plan.ToString(), "2018/01");
                Assert.AreEqual(plan.ToString("yy/mm"), "18/01");
                Assert.AreEqual(Monthly.FromDot(501).ToString("yy/mm"), "05/01");
                Assert.AreEqual(plan.ToString("YYYY年m月"), "2018年1月");
                Assert.AreEqual(plan.ToString("公元YyYy年mM月,哈哈..."), "公元2018年01月,哈哈...");
    
                //比较相等
                Assert.IsTrue(plan.Equals(Monthly.FromDot(201801)));
                Assert.IsTrue(plan.Equals(new DateTime(2018, 1, 1)));
                Assert.IsTrue(plan.Equals((object)Monthly.FromDot(201801)));
                Assert.IsFalse(plan.Equals(Monthly.FromDot(201901)));
            }
        }
    }
    

    其中的五个重载方法之一的结构 TimeSpan( int days, int hours, int minutes, int seconds )

    其中的五个重载方法之一的结构 TimeSpan( int days, int hours, int minutes, int seconds )

    1.1 说明

    Date对象,是操作日期和时间的对象。Date对象对日期和时间的操作只能通过方法。

    Monthly使用介绍

    下面的列表涵盖了其中的一部分方法及属性解释

    下面的列表涵盖了其中的一部分方法及属性解释

    1.2 属性

    无;Date对象对日期和时间的操作只能通过方法。

     

    1.Monthly构造

      //创建一个“2018年1月”的账期
       Monthly m1 = 201801;
       Monthly m2 = new Monthly(2018, 1);
       Monthly m3 = Monthly.FromDate(new DateTime(2018, 1, 1));
       Monthly m4 = Monthly.FromDot(201801);
       Monthly m5 = Monthly.FromTickes(2018 * 12   1);
       Monthly m6 = Monthly.FromString("2018年01月");
    
       Monthly cur = Monthly.Current;   //当前时间实例
       Monthly min = Monthly.MinValue;  //Monthly最小实例
       Monthly max = Monthly.MaxValue;  //Monthly最大实例
    

    Add:与另一个TimeSpan值相加。

    Add:与另一个TimeSpan值相加。

    2. 构造函数

    2. Monthly属性

    属性 说明
    Year 获取当前实例的年
    Month 获取当前实例的月
    Dot 获取当前实例的年月标记值,如2018年1月记为 : 201801
    Tickes 获取当前实例从公元零年一月开始的月份累计值
    First 获取当前年份的一月为依据的新实例
    Last 获取当前年份的十二月为依据的新实例
    Previous 获取当前时间点的上月为依据的新实例
    Next 获取当前时间点的下月为依据的新实例
    Quarter 获取当前实例所在的季度

    Days:返回用天数计算的TimeSpan值。

    Days:返回用天数计算的TimeSpan值。

    2.1 new Date() :返回当前的本地日期和时间

    参数:

    返回值:

    {Date} 返回一个表示本地日期和时间的Date对象。

    示例:

    var dt = new Date();
    console.log(dt); // => 返回一个表示本地日期和时间的Date对象
    

     

    3.Monthly方法

    • ToDot();
      说明:获取当前实例的年月标记值,如2018年1月记为 : 201801
    • AddYears(int years)
      说明:以当前实例与years的和值为依据创建一个新实例

    • AddMonths(int months)
      说明:以当前实例与months的和值为依据创建一个新实例

    • Equals(Monthly other)
      说明:判断当前实例的值与给定实例的值是否相等
    • Equals(object obj)
      说明:判断当前实例的值与给定实例的转换值是否相等,obj可以是DateTime类型
    • SpanMonths(Monthly other)
      说明:获取当前实例与给定实例的月份差值
    • SpanMonths(DateTime date)
      说明:获取当前实例与DateTime实例的月份差值
    • CompareTo(Monthly other)
      说明:获取当前实例与给定实例的大小比较的结果标识, -1:小于other实例值 ; 0 等于other实例值 ; 1:大于other实例值
    • List<Monthly> Axis(int from, int to)
      说明:获取一段时间内的Monthly数轴(包含开始与结束月份)
    • List<Monthly> Axis(Monthly from, Monthly to)
      说明:同 List Axis(int from, int to)
    • ToString(string format = "yyyy/mm")
      说明:获取包含"Y、y、M、m"字符格式的自定义Monthly字符串,format 格式如:yyyy/mm ; yy/mm ; yyyy年mm月 ;YYYY-Mm...,不区分大小写

    示例:

       Monthly m = 201801;
       m.CompareTo(201701);            
       m.Equals(DateTime.Now);
       m.Equals(201701);
       m.SpanMonths(new DateTime(2017, 1, 1));
       m.SpanMonths(201701);
    
       m.ToString();
       m.ToString("yy/mm");
       Monthly.FromDot(501).ToString("yy/mm");
       m.ToString("YYYY年m月");
       m.ToString("公元YyYy年mM月,哈哈...");
    

    Duration:获取TimeSpan的绝对值。

    Duration:获取TimeSpan的绝对值。

    2.2 new Date(milliseconds) :把毫秒数转换为Date对象

    参数:

    ①milliseconds {int} :毫秒数;表示从'1970/01/01 00:00:00'为起点,开始叠加的毫秒数。

    注意:起点的时分秒还要加上当前所在的时区,北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00'

    返回值:

    {Date} 返回一个叠加后的Date对象。

    示例:

    var dt = new Date(1000 * 60 * 1); // 前进1分钟的毫秒数
    console.log(dt); // => {Date}:1970/01/01 08:01:00
    dt = new Date(-1000 * 60 * 1); // 倒退1分钟的毫秒数
    console.log(dt); // => {Date}:1970/01/01 07:59:00
    

     

    4.Monthly操作符

    Monthly支持 、- 、* 、/ 、> 、>= 、< 、<= 、 、-- 、== 、!= 运算符操作。

    特别注意:-操作,他有operator -(Monthly m, int months)operator -(Monthly m1, Monthly m2)两个重载版本,且方法功能不同,如果是第二个版本,则必须显式标注被减对象的数据类型,如m-(Monthly)201701

    参考:
    微软Datetime数据类型

    Hours:返回用小时计算的TimeSpan值

    Hours:返回用小时计算的TimeSpan值

    2.3 new Date(dateStr) :把字符串转换为Date对象

    参数:

    ①dateStr {string} :可转换为Date对象的字符串(可省略时间);字符串的格式主要有两种:

    1) yyyy/MM/dd HH:mm:ss (推荐):若省略时间,返回的Date对象的时间为 00:00:00。

    2) yyyy-MM-dd HH:mm:ss :若省略时间,返回的Date对象的时间为 08:00:00(加上本地时区)。若不省略时间,此字符串在IE中会转换失败!

    返回值:

    {Date} 返回一个转换后的Date对象。

    示例:

    var dt = new Date('2014/12/25'); // yyyy/MM/dd
    console.log(dt); // => {Date}:2014/12/25 00:00:00
    dt = new Date('2014/12/25 12:00:00'); // yyyy/MM/dd HH:mm:ss
    console.log(dt); // => {Date}:2014/12/25 12:00:00
    
    dt = new Date('2014-12-25'); // yyyy-MM-dd
    console.log(dt); // => {Date}:2014-12-25 08:00:00 (加上了东8区的时区)
    dt = new Date('2014-12-25 12:00:00'); // yyyy-MM-dd HH:mm:ss (注意:此转换方式在IE中会报错!)
    console.log(dt); // => {Date}:2014-12-25 12:00:00 
    

     

    Milliseconds:返回用毫秒计算的TimeSpan值。

    Milliseconds:返回用毫秒计算的TimeSpan值。

    2.4 new Date(year, month, opt_day, opt_hours, opt_minutes, opt_seconds, opt_milliseconds) :把年月日、时分秒转换为Date对象

    参数:

    ①year {int} :年份;4位数字。如:1999、2014

    ②month {int} :月份;2位数字。从0开始计算,0表示1月份、11表示12月份。

    ③opt_day {int} 可选:号; 2位数字;从1开始计算,1表示1号。

    ④opt_hours {int} 可选:时;2位数字;取值0~23。

    ⑤opt_minutes {int} 可选:分;2位数字;取值0~59。

    ⑥opt_seconds {int} 可选:秒;2未数字;取值0~59。

    ⑦opt_milliseconds {int} 可选:毫秒;取值0~999。

    返回值:

    {Date} 返回一个转换后的Date对象。

    示例:

    var dt = new Date(2014, 11); // 2014年12月(这里输入的月份数字为11) 
    console.log(dt); // => {Date}:2014/12/01 00:00:00
    dt = new Date(2014, 11, 25); // 2014年12月25日
    console.log(dt); // => {Date}:2014/12/25 00:00:00
    dt = new Date(2014, 11, 25, 15, 30, 40); // 2014年12月25日 15点30分40秒
    console.log(dt); // => {Date}:2014/12/25 15:30:40
    dt = new Date(2014, 12, 25); // 2014年13月25日(这里输入的月份数字为12,表示第13个月,跳转到第二年的1月)
    console.log(dt); // => {Date}:2015/01/25
    

     

    Minutes:返回用分钟计算的TimeSpan值。

    Minutes:返回用分钟计算的TimeSpan值。

    3. 实例方法

      Date对象的实例方法主要分为2种形式:本地时间和UTC时间。同一个方法,一般都会有此2种时间格式操作(方法名带UTC的,就是操作UTC时间),这里主要介绍对本地时间的操作。

     

    Negate:返回当前实例的相反数。

    Negate:返回当前实例的相反数。

    3.1 get方法

    Seconds:返回用秒计算的TimeSpan值。

    Seconds:返回用秒计算的TimeSpan值。

    3.1.1 getFullYear() :返回Date对象的年份值;4位年份。

    Subtract:从中减去另一个TimeSpan值。

    Subtract:从中减去另一个TimeSpan值。

    3.1.2 getMonth() :返回Date对象的月份值。从0开始,所以真实月份=返回值 1 。

    Ticks:返回TimeSpan值的tick数。

    Ticks:返回TimeSpan值的tick数。

    3.1.3 getDate() :返回Date对象的月份中的日期值;值的范围1~31 。

    TotalDays:返回TimeSpan值表示的天数。

    TotalDays:返回TimeSpan值表示的天数。

    3.1.4 getHours() :返回Date对象的小时值。

    TotalHours:返回TimeSpan值表示的小时数。

    TotalHours:返回TimeSpan值表示的小时数。

    3.1.5 getMinutes() :返回Date对象的分钟值。

    TotalMilliseconds:返回TimeSpan值表示的毫秒数。

    TotalMilliseconds:返回TimeSpan值表示的毫秒数。

    3.1.6 getSeconds() :返回Date对象的秒数值。

    TotalMinutes:返回TimeSpan值表示的分钟数。

    TotalMinutes:返回TimeSpan值表示的分钟数。

    3.1.7 getMilliseconds() :返回Date对象的毫秒值。

    TotalSeconds:返回TimeSpan值表示的秒数。

    TotalSeconds:返回TimeSpan值表示的秒数。

    3.1.8 getDay() :返回Date对象的一周中的星期值;0为星期天,1为星期一、2为星期二,依此类推

    代码实例

    代码实例

    3.1.9 getTime() :返回Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00') 。

    示例:

    dt.getFullYear(); // => 2014:年
    dt.getMonth(); // => 11:月;实际为12月份(月份从0开始计算)
    dt.getDate(); // => 25:日
    dt.getHours(); // => 15:时
    dt.getMinutes(); // => 30:分
    dt.getSeconds(); // => 40:秒
    dt.getMilliseconds(); // => 333:毫秒
    dt.getDay(); // => 4:星期几的值
    dt.getTime(); // => 1419492640333 :返回Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00') 
    

     

     

     

    3.2 set方法

    新葡亰496net 1新葡亰496net 2

    新葡亰496net 3 View Code

    3.2.1 setFullYear(year, opt_month, opt_date) :设置Date对象的年份值;4位年份。

    TimeSpan ts = new TimeSpan(12, 12, 11, 12, 21);
                int days = new TimeSpan(12, 12, 11, 12, 21).Days;
                TimeSpan duration = new TimeSpan(-12, 12, 11, 12, 21).Duration();//24小时的反值
                double totalDays = new TimeSpan(12, 12, 11, 12, 21).TotalDays;
                double totalHours = new TimeSpan(2, 12, 11, 12, 21).TotalHours;
                int hours = new TimeSpan(12, 12, 11, 12, 21).Hours;
                int minutes = new TimeSpan(12, 12, 11, 12, 21).Minutes;
                TimeSpan ts2 = new TimeSpan(1, 3, 01, 12, 21);
               // TimeSpan ts2 = new TimeSpan(5, 3, 1, 12, 21);//this is also right
                TimeSpan ts3 = new TimeSpan(5, 3, 01, 12, 21).Add(ts);
                TimeSpan ts4 = new TimeSpan(4, 3, 01, 12, 21).Subtract(ts);
                TimeSpan ts5 = new TimeSpan(4, 3, 01, 12, 21).Subtract(ts).Duration();
                TimeSpan Negate = new TimeSpan(5, 3, 01, 12, 21).Negate();
                DateTime dtnow = DateTime.Now;
                Console.WriteLine(ts);
                Console.WriteLine(days);
                Console.WriteLine(duration);
                Console.WriteLine(totalDays);
                Console.WriteLine(totalHours);
                Console.WriteLine(hours);
                Console.WriteLine(minutes);
                Console.WriteLine(ts2);
                Console.WriteLine(ts ts2);
                Console.WriteLine(ts3);
                Console.WriteLine("Subtract:" ts4);
                Console.WriteLine("Duration:"   ts5);
                Console.WriteLine(ts - ts2);
                Console.WriteLine(Negate);
                DateTime span = DateTime.Now.Add(ts2);
                TimeSpan spdate = span - DateTime.Now;
                long dateTicks = DateTime.Now.Add(ts2).Ticks;
                Console.WriteLine(span);
                Console.WriteLine(spdate);
                Console.WriteLine(dateTicks);
    

    新葡亰496net 4

    3.2.2 setMonth(month, opt_date) :设置Date对象的月份值。0表示1月,11表示12月。

    View Code

     

    3.2.3 setDate(date) :设置Date对象的月份中的日期值;值的范围1~31 。

    新葡亰496net 5

     

    3.2.4 setHours(hour, opt_min, opt_sec, opt_msec) :设置Date对象的小时值。

     

     

    3.2.5 setMinutes(min, opt_sec, opt_msec) :设置Date对象的分钟值。

     

    负数

    3.2.6 setSeconds(sec, opt_msec) :设置Date对象的秒数值。

     

    上面是较晚的日期减较早的日期,所以各属性值为正数,如果是较早的日期减较晚的日期,则属性值为负数。

    3.2.7 setMilliseconds(msec) :设置Date对象的毫秒值。

    负数

    ASP.NET 中,两个时间相减,得到一个 TimeSpan 实例,TimeSpan 有一些属性:Days、TotalDays、Hours、TotalHours、Minutes、TotalMinutes、Seconds、TotalSeconds、Ticks,注意没有 TotalTicks。

    示例:

    var dt = new Date();
    dt.setFullYear(2014); // => 2014:年
    dt.setMonth(11); // => 11:月;实际为12月份(月份从0开始计算)
    dt.setDate(25); // => 25:日
    dt.setHours(15); // => 15:时
    dt.setMinutes(30); // => 30:分
    dt.setSeconds(40); // => 40:秒
    dt.setMilliseconds(333); // => 333:毫秒
    console.log(dt); // =>  2014年12月25日 15点30分40秒 333毫秒
    

     

    上面是较晚的日期减较早的日期,所以各属性值为正数,如果是较早的日期减较晚的日期,则属性值为负数。

    举例说明

    3.3 其他方法

    ASP.NET 中,两个时间相减,得到一个 TimeSpan 实例,TimeSpan 有一些属性:Days、TotalDays、Hours、TotalHours、Minutes、TotalMinutes、Seconds、TotalSeconds、Ticks,注意没有 TotalTicks。

    •时间 1 是 2010-1-2 8:43:35;

    3.3.1 toString() :将Date转换为一个'年月日 时分秒'字符串

    举例说明

    时间 2 是 2010-1-12 8:43:34。

    3.3.2 toLocaleString() :将Date转换为一个'年月日 时分秒'的本地格式字符串

    •时间 1 是 2010-1-2 8:43:35;

    用时间 2 减时间 1,得到一个 TimeSpan 实例。

    3.3.3 toDateString() :将Date转换为一个'年月日'字符串

    时间 2 是 2010-1-12 8:43:34。

    那么时间 2 比时间 1 多 9 天 23 小时 59 分 59 秒。

    3.3.4 toLocaleDateString() :将Date转换为一个'年月日'的本地格式字符串

    用时间 2 减时间 1,得到一个 TimeSpan 实例。

    那么,Days 就是 9,Hours 就是 23,Minutes 就是 59,Seconds 就是 59。

    3.3.5 toTimeString() :将Date转换为一个'时分秒'字符串

    那么时间 2 比时间 1 多 9 天 23 小时 59 分 59 秒。

    再来看 Ticks,Tick 是一个计时周期,表示一百纳秒,即一千万分之一秒,那么 Ticks 在这里表示总共相差多少个时间周期,即:9 * 24 * 3600 * 10000000 23 * 3600 * 10000000 59 * 60 * 10000000

    3.3.6 toLocaleTimeString() :将Date转换为一个'时分秒'的本地格式字符串

    那么,Days 就是 9,Hours 就是 23,Minutes 就是 59,Seconds 就是 59。

    • 59 * 10000000 = 8639990000000。3600 是一小时的秒数。

    3.3.7 valueOf() :与getTime()一样, 返回Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00') 

    再来看 Ticks,Tick 是一个计时周期,表示一百纳秒,即一千万分之一秒,那么 Ticks 在这里表示总共相差多少个时间周期,即:9 * 24 * 3600 * 10000000 23 * 3600 * 10000000 59 * 60 * 10000000 59 * 10000000 = 8639990000000。3600 是一小时的秒数。

    TotalDays 就是把 Ticks 换算成日数,即:8639990000000 / (10000000 * 24 * 3600) = 9.99998842592593。

    示例:

    var dt = new Date();
    console.log(dt.toString()); // => Tue Dec 23 2014 22:56:11 GMT 0800 (中国标准时间) :将Date转换为一个'年月日 时分秒'字符串
    console.log(dt.toLocaleString()); // => 2014年12月23日 下午10:56:11  :将Date转换为一个'年月日 时分秒'的本地格式字符串
    
    console.log(dt.toDateString()); // => Tue Dec 23 2014 :将Date转换为一个'年月日'字符串
    console.log(dt.toLocaleDateString()); // => 2014年12月23日 :将Date转换为一个'年月日'的本地格式字符串
    
    console.log(dt.toTimeString()); // => 22:56:11 GMT 0800 (中国标准时间) :将Date转换为一个'时分秒'字符串
    console.log(dt.toLocaleTimeString()); // => 下午10:56:11 :将Date转换为一个'时分秒'的本地格式字符串
    
    console.log(dt.valueOf()); // => 返回Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00') 
    

     

    TotalDays 就是把 Ticks 换算成日数,即:8639990000000 / (10000000 * 24 * 3600) = 9.99998842592593。

    TotalHours 就是把 Ticks 换算成小时数,即:8639990000000 / (10000000 * 3600) = 239.999722222222。

    4. 静态方法

    TotalHours 就是把 Ticks 换算成小时数,即:8639990000000 / (10000000 * 3600) = 239.999722222222。

    TotalMinutes 就是把 Ticks 换算成分钟数,即:8639990000000 / (10000000 * 60) = 14399.9833333333。

    4.1 Date.now()

    说明:返回当前日期和时间的Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00') 

    参数:

    返回值:

    {int} :当前时间与起始时间之间的毫秒数。

    示例:

    console.log(Date.now()); // => 1419431519276 
    

      

    TotalMinutes 就是把 Ticks 换算成分钟数,即:8639990000000 / (10000000 * 60) = 14399.9833333333。

    TotalSeconds 就是把 Ticks 换算成秒数,即:8639990000000 / (10000000) = 863999。

    4.2 Date.parse(dateStr)

    说明:把字符串转换为Date对象 ,然后返回此Date对象与'1970/01/01 00:00:00'之间的毫秒值(北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00')

    参数:

    ①dateStr {string} :可转换为Date对象的字符串(可省略时间);字符串的格式主要有两种:

    1) yyyy/MM/dd HH:mm:ss (推荐):若省略时间,返回的Date对象的时间为 00:00:00。

    2) yyyy-MM-dd HH:mm:ss :若省略时间,返回的Date对象的时间为 08:00:00(加上本地时区)。若不省略时间,此字符串在IE中返回NaN(非数字)!

    返回值:

    {int} 返回转换后的Date对象与起始时间之间的毫秒数。

    示例:

    console.log(Date.parse('2014/12/25 12:00:00')); // => 1419480000000 
    console.log(Date.parse('2014-12-25 12:00:00')); // => 1419480000000  (注意:此转换方式在IE中返回NaN!)
    

     

    TotalSeconds 就是把 Ticks 换算成秒数,即:8639990000000 / (10000000) = 863999。

    以下提供一些常用的方法

    5. 实际操作

    以下提供一些常用的方法

    求离最近发表时间的函数
    public string DateStringFromNow(DateTime dt)
    {
    TimeSpan
    span = DateTime.Now - dt;
    if (span.TotalDays > 60)
    {
    return
    dt.ToShortDateString();
    }
    else if ( span.TotalDays > 30 )
    {

    5.1 C#的DateTime类型转换为Js的Date对象

    说明:C#的DateTime类型通过Json序列化返回给前台的格式为:"/Date(1419492640000)/" 。中间的数字,表示DateTime的值与起始时间之间的毫秒数。

    示例:

    后台代码:简单的ashx

    public void ProcessRequest (HttpContext context) {
        System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
        DateTime dt = DateTime.Parse("2014-12-25 15:30:40");
        string rs = js.Serialize(dt); // 序列化成Json
        context.Response.ContentType = "text/plain";
        context.Response.Write(rs);
    }
    

    前台代码:

    var dateTimeJsonStr = '/Date(1419492640000)/'; // C# DateTime类型转换的Json格式
    var msecStr = dateTimeJsonStr.toString().replace(//Date(([-]?d ))//gi, "$1"); // => '1419492640000' :通过正则替换,获取毫秒字符串
    var msesInt = Number.parseInt(msecStr); // 毫秒字符串转换成数值
    var dt = new Date(msesInt); // 初始化Date对象
    console.log(dt.toLocaleString()); // => 2014年12月25日 下午3:30:40 
    

     

    求离最近发表时间的函数
    public string DateStringFromNow(DateTime dt)
    {
    TimeSpan
    span = DateTime.Now - dt;
    if (span.TotalDays > 60)
    {
    return
    dt.ToShortDateString();
    }
    else if ( span.TotalDays > 30 )
    {

    return "1个月前";
    }
    else if (span.TotalDays > 14)
    {
    return
    "2周前";
    }
    else if (span.TotalDays > 7)
    {
    return "1周前";
    }

    5.2  获取倒计时

    说明:计算当前时间离目的时间相差多少天时分。

    示例:

    /**
    * 返回倒计时
    * @param dt {Date}:目的Date对象
    * @return {Strin} :返回倒计时:X天X时X分
    */
    function getDownTime(dt) {
        // 1.获取倒计时
        var intervalMsec = dt - Date.now(); // 目的时间减去现在的时间,获取两者相差的毫秒数
        var intervalSec = intervalMsec / 1000; // 转换成秒数
        var day = parseInt(intervalSec / 3600 / 24); // 天数
        var hour = parseInt((intervalSec - day * 24 * 3600) / 3600); // 小时
        var min = parseInt((intervalSec - day * 24 * 3600 - hour * 3600) / 60); // 分钟
    
        // 2.若相差的毫秒小于0 ,表示目的时间小于当前时间,这时的取的值都是负的:-X天-时-分,显示时,只显示天数前面为负的就行。
        if (intervalMsec < 0) {
            hour = 0 - hour;
            min = 0 - min;
        }
    
        // 3.拼接字符串并返回
        var rs = day   '天'   hour   '时'   min   '分';
        return rs;
    }
    
    // 当前时间:2014/12/28 13:26
    console.log(getDownTime(new Date('2015/06/01'))); // => 154天10时33分
    console.log(getDownTime(new Date('2014/01/01'))); // => -361天13时26分
    

     

    return "1个月前";
    }
    else if (span.TotalDays > 14)
    {
    return
    "2周前";
    }
    else if (span.TotalDays > 7)
    {
    return "1周前";
    }

    else if (span.TotalDays > 1)
    {
    return string.Format("{0}天前",
    (int)Math.Floor(span.TotalDays));
    }
    else if (span.TotalHours > 1)
    {
    return string.Format("{0}小时前", (int)Math.Floor(span.TotalHours));
    }
    else if (span.TotalMinutes > 1)
    {
    return string.Format("{0}分钟前", (int)Math.Floor(span.TotalMinutes));
    }
    else if (span.TotalSeconds >= 1)
    {
    return string.Format("{0}秒前",
    (int)Math.Floor(span.TotalSeconds));
    }

    5.3 比较2个Date对象的大小

    说明:可以对比2者的与起始时间的毫秒数,来区分大小。

    示例:

    var dt1 = new Date('2015/12/01');
    var dt2 = new Date('2015/12/25');
    console.log(dt1 > dt2); // => false
    

     

    End

    Web开发之路系列文章

    菜单加载中...

    else if (span.TotalDays > 1)
    {
    return string.Format("{0}天前",
    (int)Math.Floor(span.TotalDays));
    }
    else if (span.TotalHours > 1)
    {
    return string.Format("{0}小时前", (int)Math.Floor(span.TotalHours));
    }
    else if (span.TotalMinutes > 1)
    {
    return string.Format("{0}分钟前", (int)Math.Floor(span.TotalMinutes));
    }
    else if (span.TotalSeconds >= 1)
    {
    return string.Format("{0}秒前",
    (int)Math.Floor(span.TotalSeconds));
    }

    else {
    return "1秒前";

    else {
    return "1秒前";

    }
    }

    }
    }

    C#中使用TimeSpan计算两个时间的差值

    C#中使用TimeSpan计算两个时间的差值

    可以反加两个日期之间任何一个时间单位。
    private string DateDiff(DateTime DateTime1, DateTime DateTime2)
    {string dateDiff = null;
    TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
    TimeSpan ts2 = new
    TimeSpan(DateTime2.Ticks);
    TimeSpan ts = ts1.Subtract(ts2).Duration();
    dateDiff = ts.Days.ToString() "天" ts.Hours.ToString() "小时" ts.Minutes.ToString() "分钟" ts.Seconds.ToString() "秒";
    return dateDiff;
    }

    可以反加两个日期之间任何一个时间单位。
    private string DateDiff(DateTime DateTime1, DateTime DateTime2)
    {string dateDiff = null;
    TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
    TimeSpan ts2 = new
    TimeSpan(DateTime2.Ticks);
    TimeSpan ts = ts1.Subtract(ts2).Duration();
    dateDiff = ts.Days.ToString() "天" ts.Hours.ToString() "小时" ts.Minutes.ToString() "分钟" ts.Seconds.ToString() "秒";
    return dateDiff;
    }

     

     

    TimeSpan ts = Date1 - Date2;

    TimeSpan ts = Date1 - Date2;

    double dDays = ts.TotalDays;//带小数的天数,比如1天12小时结果就是1.5

    double dDays = ts.TotalDays;//带小数的天数,比如1天12小时结果就是1.5

    比如1天12小时结果就是1.5

    比如1天12小时结果就是1.5

    int nDays = ts.Days;//整数天数,1天12小时或者1天20小时结果都是1

    int nDays = ts.Days;//整数天数,1天12小时或者1天20小时结果都是1

    /// <summary>
    /// 日期比较
    /// </summary>
    /// <param name="today">当前日期</param>
    /// <param name="writeDate">输入日期</param>
    /// <param name="n">比较天数</param>
    <returns>大于天数返回true,小于返回false</returns>
    private bool CompareDate(string today, string writeDate, int n)
    {
    DateTime Today = Convert.ToDateTime(today);
    DateTime WriteDate = Convert.ToDateTime(writeDate);
    WriteDate = WriteDate.AddDays(n);
    if (Today>= WriteDate)
    return false;
    else
    return true;
    }

    /// <summary>
    /// 日期比较
    /// </summary>
    /// <param name="today">当前日期</param>
    /// <param name="writeDate">输入日期</param>
    /// <param name="n">比较天数</param>
    <returns>大于天数返回true,小于返回false</returns>
    private bool CompareDate(string today, string writeDate, int n)
    {
    DateTime Today = Convert.ToDateTime(today);
    DateTime WriteDate = Convert.ToDateTime(writeDate);
    WriteDate = WriteDate.AddDays(n);
    if (Today>= WriteDate)
    return false;
    else
    return true;
    }

    在定义Date数据类型时候,必须注意下面三点:

    在定义Date数据类型时候,必须注意下面三点:

    1. Date数值必须以数字符号"#"括起来。

    1. Date数值必须以数字符号"#"括起来。

    2. Date数值中的日期数据可有可无,如果有必须符合格式"m/d/yyyy"。

    2. Date数值中的日期数据可有可无,如果有必须符合格式"m/d/yyyy"。

    3. Date数值中的时间数据可有可无,如果有必须和日期数据通过空格分开,并且时分秒之间以":"分开。

    3. Date数值中的时间数据可有可无,如果有必须和日期数据通过空格分开,并且时分秒之间以":"分开。

    一.DateTime和TimeSpan的关系和区别:

    一.DateTime和TimeSpan的关系和区别:

    DateTime和TimeSpan是Visual Basic .Net中用以处理时间日期类型数据的二个主要的结构,这二者的区别在于,DatTime表示一个固定的时间,而TimeSpan表示的是一个时间间隔, 即一段时间。在下面介绍的程序示例中,TimeSpan就用以当前时间和给定时间之差。

    DateTime和TimeSpan是Visual Basic .Net中用以处理时间日期类型数据的二个主要的结构,这二者的区别在于,DatTime表示一个固定的时间,而TimeSpan表示的是一个时间间隔, 即一段时间。在下面介绍的程序示例中,TimeSpan就用以当前时间和给定时间之差。

    二.DateTime和TimeSpan中的常用成员及其说明

    二.DateTime和TimeSpan中的常用成员及其说明

    DateTime结构和TimeSpan结构提供了丰富的方法和属性,

    DateTime结构和TimeSpan结构提供了丰富的方法和属性,

    属性 说明
    Date 获取此实例的日期部分。
    Day 获取此实例所表示的日期为该月中的第几天。
    DayOfWeek 获取此实例所表示的日期是星期几。
    DayOfYear 获取此实例所表示的日期是该年中的第几天。
    Hour 获取此实例所表示日期的小时部分。
    Millisecond 获取此实例所表示日期的毫秒部分。
    Minute 获取此实例所表示日期的分钟部分。
    Month 获取此实例所表示日期的月份部分。
    Now 创建一个DateTime实例,它是此计算机上的当前本地日期和时间。
    Second 获取此实例所表示日期的秒部分。
    TimeOfDay 获取此实例的当天的时间。
    Today 获取当前日期。
    Year 获取此实例所表示日期的年份部分。

    属性 说明
    Date 获取此实例的日期部分。
    Day 获取此实例所表示的日期为该月中的第几天。
    DayOfWeek 获取此实例所表示的日期是星期几。
    DayOfYear 获取此实例所表示的日期是该年中的第几天。
    Hour 获取此实例所表示日期的小时部分。
    Millisecond 获取此实例所表示日期的毫秒部分。
    Minute 获取此实例所表示日期的分钟部分。
    Month 获取此实例所表示日期的月份部分。
    Now 创建一个DateTime实例,它是此计算机上的当前本地日期和时间。
    Second 获取此实例所表示日期的秒部分。
    TimeOfDay 获取此实例的当天的时间。
    Today 获取当前日期。
    Year 获取此实例所表示日期的年份部分。

    Add 将指定的TimeSpan的值加到此实例的值上。
    AddDays 将指定的天数加到此实例的值上。
    AddHours 将指定的小时数加到此实例的值上。
    新葡亰496net,AddMilliseconds 将指定的毫秒数加到此实例的值上。
    AddMinutes 将指定的分钟数加到此实例的值上。
    AddMonths 将指定的月份数加到此实例的值上。
    AddSeconds 将指定的秒数加到此实例的值上。
    AddYears 将指定的年份数加到此实例的值上。
    DaysInMonth 返回指定年份中指定月份的天数。
    IsLeapYear 返回指定的年份是否为闰年的指示。
    Parse 将日期和时间的指定字符串表示转换成其等效的DateTime实例。
    Subtract 从此实例中减去指定的时间或持续时间。
    ToLongDateString 将此实例的值转换为其等效的长日期字符串表示形式。
    ToLongTimeString 将此实例的值转换为其等效的长时间字符串表示形式。
    ToShortTimeString 将此实例的值转换为其等效的短时间字符串表示形式。
    ToShortDateString 将此实例的值转换为其等效的短日期字符串表示形式。

    Add 将指定的TimeSpan的值加到此实例的值上。
    AddDays 将指定的天数加到此实例的值上。
    AddHours 将指定的小时数加到此实例的值上。
    AddMilliseconds 将指定的毫秒数加到此实例的值上。
    AddMinutes 将指定的分钟数加到此实例的值上。
    AddMonths 将指定的月份数加到此实例的值上。
    AddSeconds 将指定的秒数加到此实例的值上。
    AddYears 将指定的年份数加到此实例的值上。
    DaysInMonth 返回指定年份中指定月份的天数。
    IsLeapYear 返回指定的年份是否为闰年的指示。
    Parse 将日期和时间的指定字符串表示转换成其等效的DateTime实例。
    Subtract 从此实例中减去指定的时间或持续时间。
    ToLongDateString 将此实例的值转换为其等效的长日期字符串表示形式。
    ToLongTimeString 将此实例的值转换为其等效的长时间字符串表示形式。
    ToShortTimeString 将此实例的值转换为其等效的短时间字符串表示形式。
    ToShortDateString 将此实例的值转换为其等效的短日期字符串表示形式。

     

     

     

    简单的后台计算

    TimeSpan ts = Convert.ToDateTime("2016 - 12 - 13 17:09:47.223") - Convert.ToDateTime("2016 - 12 - 13 13:36:10.023");

    int spend_time = Convert.ToInt32(ts.TotalMinutes);

    返回分钟时间

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496net:时间间隔,Date对象详解

    关键词: