在公司一直做前端,经理叫我写一个后端函数,要求是:

参数:DateTime--传入任意时间类型
返回:string --返回传入参数时间与当前时间的相对时间字符串,如:3天前,1小时前,5分钟前。

注意判断,返回值最大单位是年,如果传入的时间与当前时间相差小于一年,则返回"x个月前",如果小于一个月,返回"x天前",小于1天,那就返回“x小时前”,如果小于1小时,返回“x分钟前”,如小于1分钟,则返回“x秒前”.... 以此类推至毫秒

然后我上网查了资料,资料很多,主要用了TimeSpan来计算时间间隔,TimeSpan可以只计算天、小时、分钟、秒、毫秒

TimeSpan ts = currentDate - dynamicTime;(当前时间-需要计算的时间)

ts.Days  ts.Hours  ts.Minutes  ts.Seconds  ts.Milliseconds 分别表示计算时间距离现在有x天x小时x分钟x秒x毫秒。

区别于

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

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

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


      假如我们求的时间是:  2018-9-30 08:30:30 - 2018-9-29 07: 30:29。用第一组的结果是 1天 1小时 0 分钟 1秒 。第二组的结果就是1.xxx天  或者25.xxx小时(xxx是小数,我的数学比较差).第一组如果时间不存在就为0,跳到下一个单位去计算。于是我用这个特性进行非0判断。如果ts.day(天数)为0。那么相距时间不会超过一天,就直接报出是几分钟前。而后的秒,毫秒不用理会。要求就是如此。如果ts.hours也为0。时间就不会超过1小时。直接看ts.minues距离几分钟。同理。。。。

但当时我想到个问题。求年、月份时,要考虑28,29,30,31号的情况。问了经理,他直接给我一串求年份和月份的代码。

DateTime currentDate = DateTime.Now;
DateTime dynamicTime = Convert.ToDateTime("2017-9-5");
int year = currentDate.Year - dynamicTime.Year; //相差的年份
int month = (currentDate.Year - dynamicTime.Year) * 12 + (currentDate.Month - dynamicTime.Month); //相差的月份

以上代码我就直接拿来用。但是其中它所求的年份是只要跨年了,即使没满12个月都算做一年。我们要求过了12个月才能算“一年前”。于是我做了如下修改,经理让我封装成函数。我不知道封装是什么。别人告诉我是接收参数,然后有个返回值。这就叫封装,我大学没学好/(ㄒoㄒ)/~~。下面是完整代码,写在控制台里。主要是else if语法和TimeSpan方法的使用。有些我没有完全明白。希望大家看到多指正我的问题,谢谢啦~ o(* ̄▽ ̄*)o

using System;

namespace time
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
string str = "";
DateTime dynamicTime = Convert.ToDateTime("2018/9/29 15:16:00 ");
str =p.GetIntervalTime(dynamicTime);  //
Console.WriteLine(str);
}
public string GetIntervalTime(DateTime dynamicTime)
{
DateTime currentDate = DateTime.Now; //获取当前时间
TimeSpan ts = currentDate - dynamicTime; //使用TimeSpan 其中ts是当前时间减去待计算时间的值
int month = (currentDate.Year - dynamicTime.Year) * 12 + (currentDate.Month - dynamicTime.Month);  //求月份,这里还没仔细推敲,就拿来用
string en = ""; //定义返回字符串
if (month >= 12)
{
int year = month / 12; //如果月份大于等于12个月。则除以12求出多少年。
en = year + "年前";
}
else if (month > 0)
{
en = month + "个月前";  //利用else if语法。这里主要也是else if语法,如果mouth小于12个月并且大于0  ,则报出 n 个月前
}
else if (ts.Days != 0)
{
en = ts.Days + "天前"; //如果month小于等于0且Day不等于0,则报出多少天前。
}
else if (ts.Hours != 0)
{
en = ts.Hours + "小时前";
}
else if (ts.Minutes != 0)
{
en = ts.Minutes + "分钟前";
}
else if (ts.Seconds != 0)
{
en = ts.Seconds + "秒前";
}
else
{
en = ts.Milliseconds + "毫秒前";
}
return en;
}

}
}

C#-返回相对时间函数的更多相关文章

  1. mysql中返回当前时间的函数或者常量

    引用:http://blog.sina.com.cn/s/blog_6d39dc6f0100m7eo.html 1.1 获得当前日期+时间(date + time)函数:now() 除了 now() ...

  2. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

  3. Linux C++中的时间函数(转)

    http://net.pku.edu.cn/~yhf/linux_c/function/03.html   asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime ...

  4. Sql Server函数全解(四)日期和时间函数

      日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外,也可以使用datetime类型的参数,但会忽略这些值的时间部分.相同 ...

  5. Oracle内置函数:时间函数,转换函数,字符串函数,数值函数,替换函数

    dual单行单列的隐藏表,看不见 但是可以用,经常用来调内置函数.不用新建表 时间函数 sysdate 系统当前时间 add_months 作用:对日期的月份进行加减 写法:add_months(日期 ...

  6. C库函数使用与总结之时间函数

    1. localtime(取得当地目前时间和日期) [头文件]#include <time.h> [函数原型]struct tm *localtime(const time_t * tim ...

  7. MySQL数据库9 - 日期与时间函数

    一 日期和时间函数 函数的概念:按指定格式输入参数,返回正确结果的运算单元 1. 返回当前日期:curdate() current_date() current_date()+0可以将当前日期转换为数 ...

  8. MySQL日期时间函数大全 转

    DAYOFWEEK(date)  返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK('1998-02-03');  ...

  9. Oracle日期时间函数大全

    ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显示值:07 yyy three digits ...

随机推荐

  1. 二十九、利用 IntelliJ IDEA 进行代码对比的方法

    我们会有这样的需求,即:想对比出两个不同版本代码的区别.如何实现? 第 1 种:如果我们是从 SVN 检出的项目,并且想比较本地代码与从 SVN 检出时的代码相比都有那些区别,可以按如下步骤操作, 如 ...

  2. ViewController里的loadView和viewDidLoad什么区别

    当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法.这个方法就会加载或者创建一个view对象 ...

  3. Advanced Plugin Concepts

    Provide Public Access to Default Plugin Settings An improvement we can, and should, make to the code ...

  4. hadoop-2.2.0 HA配置

    采用的是4台真实机器: namenode:qzhong  node27 datanode:qzhong node27 node100 node101 操作系统环境:qzhong(Ubuntu-14.0 ...

  5. careercup-扩展性和存储限制10.6

    题目 你有10亿个url,每个url对应一个非常大的网页.你怎么检测重复的网页? 解答 网页大,数量多,要把它们载入内存是不现实的. 因此我们需要一个更简短的方式来表示这些网页.而hash表正是干这事 ...

  6. Memcache随笔

    Tip01: Memcache 中记录的缓存如果你设置了失效时间,之后如果你在系统时间中将时间修改为超过失效时间,再次访问之前你设置的资源,Memcache 会认为你设置的缓存已失效: Tip02: ...

  7. 创建<Bean>sessionFactory错误, init方法调用失败;嵌套异常是org.hibernate.exception。

    未知原因:在Maven中hibernate映射开启了自动更新表,出现此异常 org.springframework.beans.factory.BeanCreationException: Error ...

  8. RPM包、YUM、system初始化进程基本知识

  9. Virtualization state: Optimized (version 7.4 installed)

    [Virtualization state: Optimized (version 7.4 installed)] [root@localhost ~]# cd /mnt/ [root@localho ...

  10. PHP Fatal error: Call to undefined function think\finfo_open()

    PHP Fatal error:  Call to undefined function think\finfo_open() php.ini      extension=php_fileinfo. ...