我正在寻找模糊日期算法 . 我刚刚开始写一个,并意识到它是一个繁琐的任务 . 它迅速退化为许多可怕的代码,以应对特殊情况,如“昨天”,“上周”和“上个月末”之间的差异,所有这些都可以(在某些情况下)指的是同一天但是个别正确根据今天的日期 .
我确信必须有一个开源模糊日期格式化器,但我找不到它 . 理想情况下,我喜欢使用NSDate(OSX / iPhone)及其格式化程序,但这并不困难 . 有没有人知道模糊日期格式化程序相对于现在采取任何时间段并返回像(但不限于)的字符串:
很久以前
-
在最后五分钟
-
今天早些时候
-
今天早上
昨晚 -
上周
-
上周三
-
上个月初
-
去年6月
-
几年前
在一个理想的世界中,我希望字符串尽可能丰富(即在“刚刚之前”返回随机变体,例如“刚才”) .
澄清 . 我正在寻找比基本的buckts和字符串更微妙的东西 . 我想要知道“昨天”和“上周三”的东西都可以指同一时期,但只有一个是正确的,今天是星期四 .
14 回答
This question should get you started.它有这个网站用于计算其相对时间的代码 . 它可能没有您想要的特定范围,但是一旦您完成设置它们就很容易添加 .
NSDateFormatter中有一个属性 - “doesRelativeDateFormatting” . 它仅出现在10.6 / iOS4.0及更高版本中,但它会将日期格式化为正确语言环境中的相对日期 .
来自Apple's Documentation:
代码
以下是为给定语言环境打印出大量相对字符串的代码 .
笔记:
不需要语言环境
英语没有那么多替换 . 在撰写本文时,有:"Yesterday, Today, Tomorrow" . Apple可能会在未来包含更多内容 .
更改区域设置并查看其他语言的可用内容非常有趣(例如,法语比英语更多)
如果在iOS上,您可能想要订阅UIApplicationSignificantTimeChangeNotification
Interface Builder
您可以在Interface Builder中设置“doesRelativeDateFormatting”属性:
选择您的NSDateFormatter并选择Inspector Palette的"Identity Inspector"选项卡(最后一个[command-6]) .
在名为"User Defined Runtime Attributes"的子部分下,您可以为所选对象(在本例中为NSDateFormatter实例)上的键添加自己的值 . 添加"doesRelativeDateFormatting",选择"Boolean"类型,并确保选中它 .
Remember :看起来好像没有设置好 .
你可能想看看date_helper.rb中的Rail的
distance_of_time_in_words
函数,我在下面粘贴了它 .所以,这是我在NSDate上为那些仍然感兴趣的人写的类别 . 问题是那些变得有点不切实际的问题之一 . 它基本上是一个巨大的开关语句(尽管我在一系列级联if()中实现它以使其更具可读性 .
对于每个时间段,我然后从一组随机的时间中选择 .
总而言之,这让我们的一些用户感到高兴,但我不确定这是值得的 .
对不起发布这个花了这么长时间......
这是基于Pretty和Humane日期和时间线程中的代码 . 我添加了“上周一,下午5点”的处理,因为我喜欢它超过x天前 . 这可以处理过去和未来几个世纪 . 我热衷于国际化方面,所以最终需要做更多的工作 . 计算在当地时区 .
我不确定你为什么说这是一个可怕的编码练习 . 每个返回字符串实际上是父集的子集,因此您可以在if / elseif链中非常优雅地执行此操作 .
根据我的经验,这些类型的日期生成器根本不是“模糊”的 . 实际上,它们只是一堆if语句的时间段 . 例如,任何小于30秒的时间都是“片刻之前”,360到390天是“一年前”等等 . 其中一些将使用目标日期来计算特殊名称(六月,周三等) . 很抱歉打破了你的幻想 .
不用说(但无论如何我会说)不要使用每年365天减少的where循环,即使在366天的闰年(或者你会发现自己在Zune开发者的行列)
这是一个c#版本:
http://tiredblogger.wordpress.com/2008/08/21/creating-twitter-esque-relative-dates-in-c/
我知道这样的时间最近变得非常受欢迎,但请考虑让它成为切换相对“模糊”日期和正常绝对日期的选项 .
例如,知道5分钟前发表评论是有用的,但是告诉我评论A是4小时前而评论B是9小时前的时间是11点,而且我宁愿知道评论A是今天早上有人醒来时写的评论B是由熬夜的人写的(假设我知道他们在我的时区) .
根据其他用户的时区,用相对时间来增加时间可能很酷,但这假设用户愿意提供它并且它是正确的 .
我对另一个问题的解决方案不满意 . 所以使用Date时间类创建了我自己的 . IMO,它更清洁 . 在我的测试中,它像我想要的那样工作 . 希望这有助于某人 .
这几乎总是使用巨大的switch语句来完成,并且实现起来很简单 .
请记住以下几点:
始终首先测试最小的时间 Span
不要忘记让你的字符串可以本地化 .
您可能会发现source from timeago很有用 . 该插件的描述是"a jQuery plugin that makes it easy to support automatically updating fuzzy timestamps (e.g. " 4分钟前" or "大约1天前")."
它将's essentially a JavaScript port of Rail' s
distance_of_time_in_words
函数塞进了一个jQuery插件 .我的公司有this .NET library做了你想要的一些,它做了非常灵活的日期时间解析(包括一些相对格式),但它只做非相对输出 .
查看Chrono的Javascript启发式日期解析器 .
Chrono支持大多数日期和时间格式,例如:
https://github.com/wanasit/chrono