咨询区

  • Jeff Atwood

给定一个 DataTime 值,如何计算如下时间?比如说:

  • 2 小时前?

  • 3 天前?

  • 1 个月前?

回答区

  • neuracnu

我在 DateTime 类上做了一个扩展方法,你可以给它传递未来或者过去的时间,还可以给他传一个 approximation 选项来指定更精细的信息描述,参考如下代码:


using System.Text;/// <summary>
/// Compares a supplied date to the current date and generates a friendly English
/// comparison ("5 days ago", "5 days from now")
/// </summary>
/// <param name="date">The date to convert</param>
/// <param name="approximate">When off, calculate timespan down to the second.
/// When on, approximate to the largest round unit of time.</param>
/// <returns></returns>
public static string ToRelativeDateString(this DateTime value, bool approximate)
{StringBuilder sb = new StringBuilder();string suffix = (value > DateTime.Now) ? " from now" : " ago";TimeSpan timeSpan = new TimeSpan(Math.Abs(DateTime.Now.Subtract(value).Ticks));if (timeSpan.Days > 0){sb.AppendFormat("{0} {1}", timeSpan.Days,(timeSpan.Days > 1) ? "days" : "day");if (approximate) return sb.ToString() + suffix;}if (timeSpan.Hours > 0){sb.AppendFormat("{0}{1} {2}", (sb.Length > 0) ? ", " : string.Empty,timeSpan.Hours, (timeSpan.Hours > 1) ? "hours" : "hour");if (approximate) return sb.ToString() + suffix;}if (timeSpan.Minutes > 0){sb.AppendFormat("{0}{1} {2}", (sb.Length > 0) ? ", " : string.Empty, timeSpan.Minutes, (timeSpan.Minutes > 1) ? "minutes" : "minute");if (approximate) return sb.ToString() + suffix;}if (timeSpan.Seconds > 0){sb.AppendFormat("{0}{1} {2}", (sb.Length > 0) ? ", " : string.Empty, timeSpan.Seconds, (timeSpan.Seconds > 1) ? "seconds" : "second");if (approximate) return sb.ToString() + suffix;}if (sb.Length == 0) return "right now";sb.Append(suffix);return sb.ToString();
}
  • neuracnu

github 上有一个非常流行的 DateTime 帮助类,可以非常精细化的满足你的要求,参见网址:https://github.com/FluentDateTime/FluentDateTime  , 比如下面这些例子:


var dateTime1 = 2.Hours().Ago();
var dateTime2 = 3.Days().Ago();
var dateTime3 = 1.Months().Ago();
var dateTime4 = 5.Hours().FromNow();
var dateTime5 = 2.Weeks().FromNow();
var dateTime6 = 40.Seconds().FromNow();
  • leppie

纯手工封装,用 SortedList 预先做一个映射,应该还是能够满足你的需求,参考如下代码。


static readonly SortedList<double, Func<TimeSpan, string>> offsets = new SortedList<double, Func<TimeSpan, string>>
{{ 0.75, _ => "less than a minute"},{ 1.5, _ => "about a minute"},{ 45, x => $"{x.TotalMinutes:F0} minutes"},{ 90, x => "about an hour"},{ 1440, x => $"about {x.TotalHours:F0} hours"},{ 2880, x => "a day"},{ 43200, x => $"{x.TotalDays:F0} days"},{ 86400, x => "about a month"},{ 525600, x => $"{x.TotalDays / 30:F0} months"},{ 1051200, x => "about a year"},{ double.MaxValue, x => $"{x.TotalDays / 365:F0} years"}
};public static string ToRelativeDate(this DateTime input)
{TimeSpan x = DateTime.Now - input;string Suffix = x.TotalMinutes > 0 ? " ago" : " from now";x = new TimeSpan(Math.Abs(x.Ticks));return offsets.First(n => x.TotalMinutes < n.Key).Value(x) + Suffix;
}

点评区

试用了下 FluentDateTime,果然????????,强烈推荐大家使用。

NET问答: 如何用 C# 计算相对时间 ?相关推荐

  1. 相关系数excel_跟着思想学外汇-如何用Excel计算货币相关性

    第十篇 大四 第六章 货币相关性 第六节 如何用Excel计算货币相关性 正如在之前课程中读到的,货币对的相关性会随着时间的推移而变化.因此,随时了解当前的系数变得更加重要. 幸运的是,货币相关性系数 ...

  2. python牛顿法求方程的根_python计算方程式根的方法 如何用python计算三元方程

    已知一元二次方程的3个参数a,b,c,编写python程序分享import math a = float(raw_input('Enter coefficient a')) b = float(raw ...

  3. 2021_lg_03.SQL实战:如何用sql计算用户留存问题

    如何用sql计算用户留存问题 一.留存 1 .留存的含义: 留存:指基准日到APP的用户在之后的n日当天返回APP的人数: 留存率 = 基准日之后的n天当日返回的用户数 / 基准日的用户数 * 100 ...

  4. Python计算日出日落时间/Astral工具包

    在这个问答(Python日出日落时间 - 问答 - Python中文网)下面看到2个工具包,suntime和astral.先尝试的suntime,根据回答给出的代码看到时间是对的,后来写完自己需要的代 ...

  5. 计算游泳时间-第10届蓝桥杯Scratch省赛真题第3题

    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第66讲. 第10届蓝桥杯青少年组省赛于2019年3月24日举行,形式为线下考试.Scrat ...

  6. 计算当前时间对应的本周一、上周一

    工作中需要计算当前时间对应的本周一.上周一,以下是对应代码: var datetime = DateTime.Now;int weeknow = Convert.ToInt32(datetime.Da ...

  7. mysql计算1000天后的日期_mysql,数据库_mysql 计算某个时间,多少天后,多少个月后时间戳,mysql,数据库,数据库设计 - phpStudy...

    mysql 计算某个时间,多少天后,多少个月后时间戳 id start_time period_ytpe period_value 1 1461427200 day 3 2 1461427200 mo ...

  8. 自动生成 指定范围日期 生成字符串格式时间日期 --计算连续时间 SQL

    DECLARE @StartTime AS DATETIME SET @StartTime= '2016-5-10 ' DECLARE @t TABLE(dDate DATETIME) --计算连续时 ...

  9. python计算一年有多少天_Python 案例 004 (计算当前时间是一年中的第几天)

    # -*- coding:utf-8 -*- """ 计算当前时间是一年中的第几天 """ bissextile = [31,60,91,1 ...

最新文章

  1. python基础--函数
  2. WinForm 应用程序中开启新的进程及控制
  3. java 从mysql 导出到excel_JAVA实现在数据库导出到EXCEL并下载
  4. 【Java】while和do-while循环比较测试案例
  5. Zookeepr 如何进行权限控制?
  6. 吴恩达机器学习笔记23-神经网络:表述--非线性假设(Non-linear Hypotheses)
  7. texlive for win10宏包更新
  8. 报错 OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
  9. 华东师范大学 计算机 博士 毕业论文,【学位】华东师范大学博士、硕士学位论文基本格式要求...
  10. python把英语句子成分字母_(完整版)英语句子成分分析(最完整版)
  11. 【GAN】生成式对抗网络论文笔记及TF2代码实现
  12. js 前端实现打印功能
  13. 视频会议的进化方向是什么?
  14. 章节1 计算机体系结构
  15. Android Studio+Emulator启动黑屏解决方法
  16. USB扫码枪无焦点输入到指定页面、指定文件框中
  17. I2C的ACK和NACK
  18. 斯塔克尔伯格竞争模型
  19. ApiView 的使用
  20. ecw2c为我唱一首堆栈溢出的歌曲:音乐尾声优化

热门文章

  1. python3常用模块_Python3 常用模块
  2. 编译安装PHP出现configure: error: MySQL configure failed. Please check config.log的解决方法
  3. hinton教授的本科生课程CSC321-机器学习中的神经网的笔记
  4. AsyncHttpClient的连接池使用逻辑
  5. Managing Gigabytes--文本压缩
  6. 谷歌chrome xp_将非Google任务列表添加到Chrome
  7. 如何在不支付Adobe Photoshop费用的情况下处理Camera Raw
  8. 修复windows脸部识别_如何在Windows 10中改善面部识别
  9. 消息队列入门(三)JMS标准及实现
  10. Druid源码分析系列1:dataSource.init()的准备工作