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

参数: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. [转]Python中下划线以及命名空间的意义

    Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public    2. __object__ # special, python sys ...

  2. Lodash数组篇

    概念简述 lodash 是一个类库 Lodash 通过降低 array.number.objects.string 等等的使用难度从而让 JavaScript 变得更简单 用法  let _ = re ...

  3. Jquery 操作 select 的操作指南

    这里我们以一个简单的select作为原型来进行说明: <select> <option value="a1">香蕉1</option> < ...

  4. java8的新特性,Collections.sort(排序的List集合)的使用,对list封装Map里面的某个值进行排序

    --------------------------对简单list的排序---------------------------------- List<Integer> list = ne ...

  5. binlog2sql 用法

    binlog2sql 用法 使用场景:binlog2sql是根据mysql的binlog (要求格式是row)反解析出delete,update操作,对误操作数据进行还原. https://githu ...

  6. Git 原理入门

    Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些基本命令,到底在做什么,你说得 ...

  7. PHP DES加密解密

    自定义密码加密解密函数,源自网友,记录保存一下. <?php /** * DES加密解密 */ class Mcrypt{ public function __construct(){} fun ...

  8. day 26 网络知识 01

    一.    c/s 架构: 客户端(client)/服务端(server)架构       服务端: 提供服务的      客户端: 享受服务的     B/S 架构:浏览器(browser)/服务端 ...

  9. 关于org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z报错

    之前一直出现这个错误,使用的开发工具是IDEA 我感觉似乎是hadoop与windows的操作系统不太适合 于是在project创建 org.apache.hadoop.io.nativeio包,将N ...

  10. 最新Altium_Designer_Beta_18.7.is AD18安装教程及破解说明

    下解Altium_Designer带破解的压缩包. 下载链接:https://pan.baidu.com/s/1TlPHtSthJKxLcXWcCR-q-g 密码:bt0g 解压缩Altium_Des ...