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

参数: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. HDU 1018Big Number(大数的阶乘的位数,利用公式)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1018 Big Number Time Limit: 2000/1000 MS (Java/Others) ...

  2. 过滤xss攻击脚本

    <?php /** * @blog http://www.phpddt.com * @param $string * @param $low 安全别级低 */ function clean_xs ...

  3. Flex布局(一)flex-direction

    采用Flex布局的元素,被称为Flex容器(flex container),简称"容器".其所有子元素自动成为容器成员,成为Flex项目(Flex item),简称"项目 ...

  4. linux 内存操作相关命令

    清理内存 echo 1 > /proc/sys/vm/drop_caches 查看内存使用情况 free –m 查看内存条数命令: dmidecode |grep -A16 "Memo ...

  5. 【转载】python发送邮件实例

    本文转自:http://www.cnblogs.com/lonelycatcher/archive/2012/02/09/2343463.html 这几天要用python发送邮件,上网找到这篇文章感觉 ...

  6. iOS/Swift Tips 1

    1.重写hitTest方法,干预iOS事件传递过程 如下所示,view上有一个button,button一半的frame在父类view bounds之外, 按照iOS系统默认的处理逻辑, 如果点击按钮 ...

  7. linux 安全防护

    一.禁止ROOT用户远程登录 linux中root用户是超级管理员,可以针对root用户暴力破解密码,这样很不安全,工作中我们一般禁止root用户直接远程登陆,开设一个或多个普通用户,只允许登陆普通用 ...

  8. Linux进程地址空间 && 进程内存布局[转]

    一 进程空间分布概述       对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初始 ...

  9. 关于js代码位置的第一次总结

    最近在学习dom树节点操作时,发现查找结点总是返回null,原因在于将js代码放在了head里,因为页面是从上往下逐行加载,在还未加载相关节点时当然查找不到,返回值为null. 而对于另一句老生常谈的 ...

  10. 用Python代码实现微信跳一跳作弊器

    最近随着微信版本的更新,在进入界面有个跳一跳的小游戏,在网上看到技术篇教你用Python来玩微信跳一跳 ( 转载自 " 工科给事中的技术博客 " ) 本文旨在总结,技术全靠大神完成 ...