仿window系统自带的日期差计算器类
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系统自带的日期差计算器类的更多相关文章
- “canvas画布仿window系统自带画图软件"项目的思考
"canvas画布仿window系统自带画图软件"项目的思考 首先贴上DEMO图,并没有美化效果.对UI有要求的,请自带补脑技术. 思考一 在做项目的过程中,我发现"工具 ...
- ShareIntentUtil【调用系统自带的分享的工具类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 根据参考资料的文章,整理了调用系统自带分享的工具类(实现了适配7.0FileProvider的功能),需要搭配<Android ...
- android系统自带的日期、时间对话框的用法
代码: package com.test; import java.util.Calendar; import android.app.Activity; import android.app.Dat ...
- php调用window系统自带的命令,比如计算器
1.在cmd命令行输入calc.exe 2.
- 完全参照系统自带的DatePickerDialog、TimePickerDialog的源代码仿写的DateTimePickerDialog
完全参照系统自带的DatePickerDialog.TimePickerDialog的源代码仿写的DateTimePickerDialog.具有同时选择日期.时间的功能.在2.2.2.3平台,显示的效 ...
- 应用程序间跳转 (友盟SSO 授权 与系统自带的分享)
应用程序间跳转的应用场景 使用第三方用户登录,如微信登录,返回用户名和密码 需要用户授权,返回到调用程序,同时返回授权的用户名 应用程序推广,跳转到itunes并显示指定app下载页 第三方支付,跳转 ...
- Android manifest之系统自带的permission
Android manifest之系统自带的permission 本文描述Android系统自带的permission.点击查看:“关于permission的原始定义和说明”.点击查看:“Androi ...
- PresentViewController切换界面(一些系统自带的页面切换动画)
视图切换,没有NavigationController的情况下,一般会使用presentViewController来切换视图并携带切换时的动画, 其中切换方法如下: – presentViewCon ...
- 关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究
关于自定义tabBar时修改系统自带tabBarItem属性造成的按钮顺序错乱的问题相关探究 测试代码:http://git.oschina.net/Xiyue/TabBarItem_TEST 简 ...
随机推荐
- 【代码笔记】iOS-页面调的时候隐藏工具条
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...
- Swift-常量变量
OC 用NSLog输出日志 swift 用print输出日志 swift语句结束不需要加:号 常量和变量: OC 定义常量 const int a = 10; swift 定义常量 let a = 1 ...
- 巧用git bash
利用git base 实现的仿linux上面的命令,进行一些类linux的操作 .如 vim ls grep .. 例 : 利用grep递归查找当前文件夹中包含php5apache字样的文件
- IT软件技术人员的职位路线(从程序员到技术总监) - 部门管理经验谈
以前写过一个文(IT从业者的职业道路(从程序员到部门经理) - 项目管理系列文章),主要介绍笔者的职业发展之路,不过该文需要后续了,因为笔者现在从事的是“产品经理”一职.从笔者的导航文([置顶]博文快 ...
- OpenSceneGraph 编译 error LNK2019:unresolved external symbol 错误
在编译 OpenSceneGraph 的一个简单示例时, #include <osgViewer/Viewer> #include <osgDB/ReadFile> void ...
- 用Retrofit发送请求中添加身份验证
用Retrofit发送请求中添加身份验证====================在安卓应用开发中, retrofit可以极大的方便发送http网络请求,不管是GET, POST, 还是PUT, DEL ...
- 项目游戏开发日记 No.0x000004
14软二杨近星(2014551622) 还有两周就要交项目了, 我们的作品, 作为作业, 好吧, 其实它完成了接近50%, (only the first bate), 其实也是各种各种忙, 然后才赶 ...
- 个人CTF资源聚合
i春秋 幻泉 CTF入门课程笔记 视频地址 能力 思维能力 快速学习能力 技术能力 基础 编程基础 (c语言 汇编语言 脚本语言) 数学基础 (算法 密码学) 脑洞 (天马行空的想象推理) 体力耐力( ...
- Servlet过滤器
Servlet过滤器 [TOC] 1.过滤器的基本概念 1.1.基本概念 过滤器(Filter)属于tomcat服务器中的Servlet功能.在普通的javaweb服务中,jsp中的请求要被Servl ...
- Error invoking SqlProvider method (com.github.abel533.mapper.MapperProvider.dynamicSQL). Cause: java.lang.InstantiationException: com.github.abel533.mapper.MapperProvider
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache.i ...