zoukankan      html  css  js  c++  java
  • 计算2个时间之间经过多少Ticks

    Ticks是一个周期,存储的是一百纳秒,换算为秒,一千万分之一秒。
    我们需要计算2个时间之间,经过多少Ticks,可以使用下面的方法来实现,使用2个时间相减。

    得到结果为正数,是使用较晚的时间减去较早的时间。反之为负数,即是使用较早的时间减去较晚的时间。

    创建一个对象:

     class Ag
        {
            private DateTime _StartDate;
    
            public DateTime StartDate
            {
                get { return _StartDate; }
                set { _StartDate = value; }
            }
            private DateTime _EndDate;
    
            public DateTime EndDate
            {
                get { return _EndDate; }
                set { _EndDate = value; }
            }
    
            public Ag(DateTime startDate, DateTime endDate)
            {
                this._StartDate = startDate;
                this._EndDate = endDate;
            }
    
            public void DurationTicks()
            {           
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine(ts.Ticks);
            }
        }
    Source Code


    在控制台应用程序运行上面写好的程序:



     
    现在来了,实际情况并非都是计算2个时间之间的Ticks,而是有可能需要计算2个时间之间的秒,分钟,小时,天等。
    为了实现上面的要求,我们得了解一些基础知识:
    1天= 24;
    1小时= 60分钟;
    1分钟= 60秒;
    1秒= 10000000Ticks;

    因此,根据上面的计算结果(Ticks)和公式可以计算出2个时间之间的秒,分钟,小时,天等。

    我们在类别中,添加下面4个方法:



     public void DurationSeconds()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine("Duraction Seconds: {0}", ts.Ticks / 10000000L);
            }
    
            public void DurationMinutes()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine("Duraction Minutes: {0}",ts.Ticks / (10000000L * 60));
            }
    
            public void DurationHours()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine("Duraction Hours: {0}", ts.Ticks / (10000000L * 60 * 60));
            }
    
            public void DurationDays()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine("Duraction Days: {0}", ts.Ticks / (10000000L * 60 * 60 * 24));
            }
    Source Code

    方法写完,在控制台测试一下上面的方法:

     上面的计算方法有点原始,MSDN已经给出相应的方法,就可以计算出2个时间之间的秒,分钟,小时,天等。如:
    TotalSeconds(),TotalMinutes(),TotalHours(),TotalDays();
    为了演示与测试,Insus.NET再创建另外4个方法:



      public void TotalSeconds()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine("Duraction Seconds: {0}", ts.TotalSeconds);
            }
    
            public void TotalMinutes()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine("Duraction Minutes: {0}", ts.TotalMinutes);
            }
    
            public void TotalHours()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine("Duraction Hours: {0}", ts.TotalHours);
            }
    
            public void TotalDays()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                Console.WriteLine("Duraction Days: {0}", ts.TotalDays);
            }
    Source Code

    再运行程序:


    最后的现成的方法,它已经封装好单位转换与公式计算。

    细心的用户有可以发现,2种结果有些不相同,没有小数和有小数。其实可以解决的,把一千万分之一秒这个基数转换为double数据类型即可。也就是说把能来的L-->D:

     public void DurationSeconds()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                // Console.WriteLine("Duraction Seconds: {0}", ts.Ticks / 10000000L);
                Console.WriteLine("Duraction Seconds: {0}", ts.Ticks / 10000000D);
            }
    
            public void DurationMinutes()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                //  Console.WriteLine("Duraction Minutes: {0}", ts.Ticks / (10000000L * 60));
                Console.WriteLine("Duraction Minutes: {0}", ts.Ticks / (10000000D * 60));
            }
    
            public void DurationHours()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                // Console.WriteLine("Duraction Hours: {0}", ts.Ticks / (10000000L * 60 * 60));  
                Console.WriteLine("Duraction Hours: {0}", ts.Ticks / (10000000D * 60 * 60));
            }
    
            public void DurationDays()
            {
                TimeSpan ts = (_EndDate - _StartDate).Duration();
                // Console.WriteLine("Duraction Days: {0}", ts.Ticks / (10000000L * 60 * 60 * 24));   
                Console.WriteLine("Duraction Days: {0}", ts.Ticks / (10000000D * 60 * 60 * 24));
            }
    Source Code

    这次,我们再次运行程序,看看结果是否与自带的方法计算的结果相同:


    OK,就这样子,你可以使用自带现成的方法,可以自己写。

    写到这里应该是结果了,但是回过头来看看自己写的代码,有一句:

    TimeSpan ts = (_EndDate - _StartDate).Duration();


    每一个方法里均有,代码冗余了,我们可以简化它,写一个方法或是属性:


    public TimeSpan Ts
            {
                get
                {
                    return (_EndDate - _StartDate).Duration();
                }
            }
    
            public long Ticks
            {
                get
                {
                    return Ts.Ticks;
                }
            }
    Source Code

    经过一次重构,8个方法里,只需要一句代码就行了:

  • 相关阅读:
    写时复制集合 —— CopyOnWriteArrayList 源码原理阅读笔记
    初步整合vue-element-admin和GitDataV两个Vue开源框架方案实现大数据可视化
    IOS苹果登录sign in with apple后端校验
    IOS审核被拒:IOS苹果授权登录(Sign in with Apple)/Apple登录/苹果登录集成教程
    ios安装自定义基座失败问题
    IOS APP上架App Store及提交审核详细教程
    IOS APP报错:SyntaxError: Invalid regular expression: invalid group specifier name __ERROR
    Apple Pay苹果支付IOS in-App Purchase内购项目服务端校验
    浅析浏览器是如何工作的(一):V8引擎、JIT机制、JS代码解释执行与编译执行
    ApplePay苹果支付内购项目配置及代码实现及沙箱测试
  • 原文地址:https://www.cnblogs.com/insus/p/7997623.html
Copyright © 2011-2022 走看看