public class MonthSubstract
{
/// <summary>
/// 日期差之月份
/// </summary>
public int Months { get; set; } /// <summary>
/// 日期差之总天数
/// </summary>
public int TotalDays { get; set; } /// <summary>
/// 日期差之除去月份剩余天数
/// </summary>
public int Days { get; set; } /// <summary>
/// 日期差之除去月份剩余周数
/// </summary>
public int Weeks { get; set; } /// <summary>
/// ToString
/// </summary>
/// <returns></returns>
public override string ToString()
{
if (Months > && Weeks > && Days > )
{
return string.Format("{0}月,{1}周,{2}天", Months,Weeks, Days);
} if (Months == && Weeks == && Days == )
{
return "相同日期";
} if (Months == && Weeks == && Days > )
{
return string.Format("{0}天", Days);
} if (Months == && Weeks > && Days == )
{
return string.Format("{0}周", Weeks);
} if (Months > && Weeks == && Days == )
{
return string.Format("{0}月", Months);
} if (Months > && Weeks > && Days == )
{
return string.Format("{0}月,{1}周", Months, Weeks);
} if (Months > && Weeks == && Days > )
{
return string.Format("{0}月,{1}天", Months, Days);
} if (Months == && Weeks > && Days > )
{
return string.Format("{0}周,{1}天", Weeks, Days);
} return string.Format("{0}月,{1}周,{2}天", Months, Weeks, Days);
} /// <summary>
/// 计算月份差
/// </summary>
/// <param name="from">开始时间</param>
/// <param name="to">结束时间</param>
/// <returns>MonthSubstract实例</returns>
public static MonthSubstract Substract(DateTime from, DateTime to)
{
var result = new MonthSubstract();
int monthCount = , dayCount = ;
var beginTime = from.Date;
var lastTime = beginTime;
var endTime = to.Date;
if (beginTime > endTime)
{
//交换时间
var tmp = beginTime;
beginTime = endTime;
endTime = tmp;
} result.TotalDays = (int)((endTime - beginTime).TotalDays);
while (beginTime < endTime)
{
lastTime = beginTime; beginTime = beginTime.AddMonths();
if (GetLastDayInMonth(lastTime) == lastTime.Day)
{
beginTime = GetLastDateInMonth(beginTime);
} if (endTime > beginTime)
monthCount++;
} dayCount = (endTime - lastTime).Days;
result.Months = monthCount;
////result.Days = dayCount;
result.Weeks = dayCount / ;
result.Days = dayCount % ; return result;
} /// <summary>
/// 获取指定时间所在月份的最后一天的日期
/// </summary>
/// <param name="date">指定时间</param>
/// <returns>最后一天的日期</returns>
private static DateTime GetLastDateInMonth(DateTime date)
{
DateTime tmp = new DateTime(date.Year, date.Month, ).AddMonths();
DateTime tmp2 = new DateTime(tmp.Year, tmp.Month, ); return tmp2.AddDays(-);
} /// <summary>
/// 获取指定时间所在月份的最后一天的日期数值
/// </summary>
/// <param name="date">指定时间</param>
/// <returns>最后一天的日期数值</returns>
private static int GetLastDayInMonth(DateTime date)
{
return GetLastDateInMonth(date).Day;
} /// <summary>
/// 获取指定时间所在月份的第1天
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
private static DateTime GetFirstDayInMonth(DateTime date)
{
return new DateTime(date.Year, date.Month, );
}
}

调用如下

            var toTime = DateTime.Now;
var beginTime = new DateTime(, , , , , );
for (int i = ; i < ; i++)
{
var rsult = MonthSubstract.Substract(beginTime, toTime);
Console.WriteLine(string.Format("日期{0}与日期{1}的差值为{2}", beginTime.ToString("yyyy-MM-dd"), toTime.ToString("yyyy-MM-dd"), rsult.ToString()));
beginTime = beginTime.AddDays();
}

有意思的是假如:当前日期是 2016.12.29日,起始日期是2016.7.30 得到的结果与 起始日期是 2016.7.31号一样,都是 "4 月, 4 周, 1 天"

这是因为11月没有31号

为了避免出现 1.31号加1个月变成2.28,而2.28加1个月变成 3.28这种狗血事情,只能用 特殊的方式来相加,最后一天加一个月,永远是下个月最后一天

仿window系统自带的日期差计算器类的更多相关文章

  1. “canvas画布仿window系统自带画图软件"项目的思考

    "canvas画布仿window系统自带画图软件"项目的思考 首先贴上DEMO图,并没有美化效果.对UI有要求的,请自带补脑技术. 思考一 在做项目的过程中,我发现"工具 ...

  2. ShareIntentUtil【调用系统自带的分享的工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 根据参考资料的文章,整理了调用系统自带分享的工具类(实现了适配7.0FileProvider的功能),需要搭配<Android ...

  3. android系统自带的日期、时间对话框的用法

    代码: package com.test; import java.util.Calendar; import android.app.Activity; import android.app.Dat ...

  4. php调用window系统自带的命令,比如计算器

    1.在cmd命令行输入calc.exe 2.

  5. 完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog

    完全参照系统自带的DatePickerDialog.TimePickerDialog的源代码仿写的DateTimePickerDialog.具有同时选择日期.时间的功能.在2.2.2.3平台,显示的效 ...

  6. 应用程序间跳转 (友盟SSO 授权 与系统自带的分享)

    应用程序间跳转的应用场景 使用第三方用户登录,如微信登录,返回用户名和密码 需要用户授权,返回到调用程序,同时返回授权的用户名 应用程序推广,跳转到itunes并显示指定app下载页 第三方支付,跳转 ...

  7. Android manifest之系统自带的permission

    Android manifest之系统自带的permission 本文描述Android系统自带的permission.点击查看:“关于permission的原始定义和说明”.点击查看:“Androi ...

  8. PresentViewController切换界面(一些系统自带的页面切换动画)

    视图切换,没有NavigationController的情况下,一般会使用presentViewController来切换视图并携带切换时的动画, 其中切换方法如下: – presentViewCon ...

  9. 关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究

      关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究 测试代码:http://git.oschina.net/Xiyue/TabBarItem_TEST 简 ...

随机推荐

  1. Java 反射 使用总结

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6074887.html1 本文出自[赵彦军的博客] 反射机制是什么 反射机制是在运行状态中,对于任意一个类,都 ...

  2. MP3文件信息批量更改器

    以前(估计是2003年)编写一个MP3文件信息批量更改器MP3TagChanger,现放上来参考.(VB6编码) 使用方法很简单,会Winamp或者千千静听的就懂使用. http://pan.baid ...

  3. Time Consume Problem

    I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...

  4. Hibernate 系列 02 - Hibernate介绍及其环境搭建

    引导目录: Hibernate 系列教程 目录 昨晚喝多了,下午刚清醒,继续搞Hibernate.走起. 觉得还行的话,记得点赞哈,给我这个渣渣点学习的动力.有错误的话也请指出,省的我在错误上走了不归 ...

  5. 【mysql】关于binlog格式

    写在前面的话 1.推荐用mixed,默认使用statement,基于上下文  set session/global binlog_format=mixed; 2.二进制日记录了数据库执行更改的操作,如 ...

  6. sys.dm_os_waiting_tasks 引发的疑问(下)

    前面写了两篇了,其实不光是说sys.dm_os_waiting_tasks的应用,研究了挺长时间的并行,自己有了一些理解,所以分享出来希望有什么理解错误的地方大神们及时纠正!! 给出前两篇的连接: 上 ...

  7. win 7下建立FTP

    1.安装FTP服务 鼠标桌面右击个性化-卸载程序-打开或关闭windows功能 2.在IIS控制面板里添加FTP站点 下一步 下一步 鼠标右击 下一步 下一步 3.配置ftp站点 4.测试站点是否正常 ...

  8. Centos6.5安装mysql不能启动,应该安装mysql-server

    centos中安装mysql很简单如下命令即可 yum install mysql 装好了, 运行mysql ERROR 2002 (HY000): Can't connect to local My ...

  9. kali linux之窥看女神上网隐私(ettercap+wireshark+zenmap +dsniff)

    作者:小波 http://www.cnblogs.com/xiaobo-Linux/ 无聊就玩了玩,不要干一些坏事哟~~网上也有一些文章关于kali linux的,就实战了一番.kali是用的debi ...

  10. Windows 10 虚拟桌面切换

    从Windows 10开始,终于有了和Mac一样的虚拟桌面了.但总感觉用着非常的别扭.在Mac中,切换虚拟桌面的操作可谓方便至极:除了触控板和Magic Mouse原生的支持外,通过罗技M557/55 ...