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

参数: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. java 中重载(Overload)和重写(Override)的区别

    首先重载和重写是应用于两个不同场景下面的两种不同的手段: 两者各自的特征: 重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不 ...

  2. 【luogu P4017 最大食物链计数】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4017 DAG + DP #include <queue> #include <cstdio ...

  3. BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌dp)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3467  Solved: 1438[Submit][Status][Discuss] Descripti ...

  4. CentOS7 更换阿里云源

    搭建opensack时原生的源不好使就换了个阿里云的源试试 百度搜到的方法:https://blog.csdn.net/chavo0/article/details/51939362 1.备份 # m ...

  5. React组件的使用

     一.index.js 文件[基本配置] //react语法塘 import React from 'react'; //reactDom用来操作虚拟DOM import ReactDom from ...

  6. vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版

    在[实现丰盛]的插件基础修改[vue2.0 移动端,下拉刷新,上拉加载更多 插件], 1.修改加载到尾页面,返回顶部刷新数据,无法继续加重下一页 2.修改加载完成文字提示 原文链接:http://ww ...

  7. mongodb副本集的docker化安装

    1. 定义 一般只要生产环境就需要考虑冗余设计,保证在某一台服务器由于某种原因宕机后服务还可以正常运行. mongo副本集是一组服务器,其中有一个主服务器(primary),用于处理客户端请求:还有多 ...

  8. xshell安装教程

    Xshell安装使用教程 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.Xshell 通过互联网到远程主机 ...

  9. MySQL的JOIN用法

    JOIN的含义就如英文单词“join”一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接.这里描述先甩出一张用烂了的图,然后插入测试数据. CREATE TABLE t_blog( i ...

  10. github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调

    github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调.仅支持一个server和一个client交互. 地址:https://github.com/rocket049/ ...