评论时间戳格式化

如图:

 

注意,评论时间戳的格式,刚才,几小时之前,几天之前.....

 

实现需要一个时间格式的工具类,如果用java.util.Date当然也可以实现,这里说的是更方便的joda-time。

maven地址:http://search.maven.org/#search%7Cga%7C1%7Cjoda-time

 

工具类如下:

package com.chunsheng.me.timestamp;import java.util.Date;
import java.util.concurrent.TimeUnit;import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Hours;
import org.joda.time.Minutes;
import org.joda.time.Months;
import org.joda.time.Weeks;
import org.joda.time.Years;class TimeStampFormatter {/*** For use with java.util.Date*/public String format(Date timestamp) {long millisFromNow = getMillisFromNow(timestamp);long minutesFromNow = TimeUnit.MILLISECONDS.toMinutes(millisFromNow);if (minutesFromNow < 1) {return "just now";}long hoursFromNow = TimeUnit.MILLISECONDS.toHours(millisFromNow);if (hoursFromNow < 1) {return formatMinutes(minutesFromNow);}long daysFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow);if (daysFromNow < 1) {return formatHours(hoursFromNow);}long weeksFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 7;if (weeksFromNow < 1) {return formatDays(daysFromNow);}long monthsFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 30;if (monthsFromNow < 1) {return formatWeeks(weeksFromNow);}long yearsFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 365;if (yearsFromNow < 1) {return formatMonths(monthsFromNow);}return formatYears(yearsFromNow);}private long getMillisFromNow(Date commentedAt) {long commentedAtMillis = commentedAt.getTime();long nowMillis = System.currentTimeMillis();return nowMillis - commentedAtMillis;}/*** For use with org.joda.DateTime*/public String format(DateTime commentedAt) {DateTime now = DateTime.now();Minutes minutesBetween = Minutes.minutesBetween(commentedAt, now);if (minutesBetween.isLessThan(Minutes.ONE)) {return "just now";}Hours hoursBetween = Hours.hoursBetween(commentedAt, now);if (hoursBetween.isLessThan(Hours.ONE)) {return formatMinutes(minutesBetween.getMinutes());}Days daysBetween = Days.daysBetween(commentedAt, now);if (daysBetween.isLessThan(Days.ONE)) {return formatHours(hoursBetween.getHours());}Weeks weeksBetween = Weeks.weeksBetween(commentedAt, now);if (weeksBetween.isLessThan(Weeks.ONE)) {return formatDays(daysBetween.getDays());}Months monthsBetween = Months.monthsBetween(commentedAt, now);if (monthsBetween.isLessThan(Months.ONE)) {return formatWeeks(weeksBetween.getWeeks());}Years yearsBetween = Years.yearsBetween(commentedAt, now);if (yearsBetween.isLessThan(Years.ONE)) {return formatMonths(monthsBetween.getMonths());}return formatYears(yearsBetween.getYears());}private String formatMinutes(long minutes) {return format(minutes, " minute ago", " minutes ago");}private String formatHours(long hours) {return format(hours, " hour ago", " hours ago");}private String formatDays(long days) {return format(days, " day ago", " days ago");}private String formatWeeks(long weeks) {return format(weeks, " week ago", " weeks ago");}private String formatMonths(long months) {return format(months, " month ago", " months ago");}private String formatYears(long years) {return format(years, " year ago", " years ago");}private String format(long hand, String singular, String plural) {if (hand == 1) {return hand + singular;} else {return hand + plural;}}}

  

PS:

Date之常用:

 private static Date date(String string) {try {return new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.UK).parse(string);} catch (ParseException e) {throw new IllegalArgumentException(e);}}private static Date dateIso(String string){try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.getDefault());simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));return simpleDateFormat.parse(string);} catch (ParseException e) {throw new IllegalArgumentException(e);}}

  

 

dateIso("2014-02-14T18:40:50Z")TimeStampFormatter t = new TimeStampFormatter();//new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.UK).parse(string)try {System.out.println(t.format(new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.CHINA).parse("2016-02-14 09:00")));} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}

  

PS:Date实现:

 

import java.util.Date;
import java.util.concurrent.TimeUnit;class TimeStampFormatter {/*** For use with java.util.Date*/public String format(Date timestamp) {long millisFromNow = getMillisFromNow(timestamp);long minutesFromNow = TimeUnit.MILLISECONDS.toMinutes(millisFromNow);if (minutesFromNow < 1) {return "just now";}long hoursFromNow = TimeUnit.MILLISECONDS.toHours(millisFromNow);if (hoursFromNow < 1) {return formatMinutes(minutesFromNow);}long daysFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow);if (daysFromNow < 1) {return formatHours(hoursFromNow);}long weeksFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 7;if (weeksFromNow < 1) {return formatDays(daysFromNow);}long monthsFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 30;if (monthsFromNow < 1) {return formatWeeks(weeksFromNow);}long yearsFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 365;if (yearsFromNow < 1) {return formatMonths(monthsFromNow);}return formatYears(yearsFromNow);}private long getMillisFromNow(Date commentedAt) {long commentedAtMillis = commentedAt.getTime();long nowMillis = System.currentTimeMillis();return nowMillis - commentedAtMillis;}private String formatMinutes(long minutes) {return format(minutes, " minute ago", " minutes ago");}private String formatHours(long hours) {return format(hours, " hour ago", " hours ago");}private String formatDays(long days) {return format(days, " day ago", " days ago");}private String formatWeeks(long weeks) {return format(weeks, " week ago", " weeks ago");}private String formatMonths(long months) {return format(months, " month ago", " months ago");}private String formatYears(long years) {return format(years, " year ago", " years ago");}private String format(long hand, String singular, String plural) {if (hand == 1) {return hand + singular;} else {return hand + plural;}}
}

  

from:http://blog.blundellapps.co.uk/creating-comments-with-timestamps-like-youtube/

 

import java.util.Date;
import java.util.concurrent.TimeUnit;import org.junit.Test;import static org.junit.Assert.assertEquals;public class JavaUtilDate_TimeStampFormatterTest {private static final int DAYS_IN_A_WEEK = 7;private static final int AVERAGE_DAYS_IN_A_MONTH = 30;private static final int DAYS_IN_YEAR = 365; // We don't need the level of accuracy of leap years@Testpublic void givenCommentedUnder60SecondsAgo_thenFormatSaysJustNow() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusSeconds(59, now());String commentedAtFormatted = formatter.format(commentedAt);assertEquals("just now", commentedAtFormatted);}@Testpublic void givenCommented1MinuteAgo_thenFormatSays1MinuteAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusMinutes(1, now());String commentedAtFormatted = formatter.format(commentedAt);assertEquals("1 minute ago", commentedAtFormatted);}@Testpublic void givenCommentedUnder60MinuteAgo_thenFormatSaysXMinutesAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusMinutes(59, minusSeconds(59, now()));String commentedAtFormatted = formatter.format(commentedAt);assertEquals("59 minutes ago", commentedAtFormatted);}@Testpublic void givenCommented1HourAgo_thenFormatSays1HourAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusHours(1, now());String commentedAtFormatted = formatter.format(commentedAt);assertEquals("1 hour ago", commentedAtFormatted);}@Testpublic void givenCommentedUnder24HoursAgo_thenFormatSaysXHoursAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusHours(23, minusMinutes(59, now()));String commentedAtFormatted = formatter.format(commentedAt);assertEquals("23 hours ago", commentedAtFormatted);}@Testpublic void givenCommented1DayAgo_thenFormatSays1DayAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusDays(1, now());String commentedAtFormatted = formatter.format(commentedAt);assertEquals("1 day ago", commentedAtFormatted);}@Testpublic void givenCommentedLessThan7DayAgo_thenFormatSaysXDaysAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusDays(6, minusHours(23, minusMinutes(59, now())));String commentedAtFormatted = formatter.format(commentedAt);assertEquals("6 days ago", commentedAtFormatted);}@Testpublic void givenCommented1WeekAgo_thenFormatSays1WeekAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusWeeks(1, now());String commentedAtFormatted = formatter.format(commentedAt);assertEquals("1 week ago", commentedAtFormatted);}@Testpublic void givenCommentedLessThan4WeeksAgo_thenFormatSaysXWeeksAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusWeeks(3, minusDays(6, minusHours(23, minusMinutes(59, now()))));String commentedAtFormatted = formatter.format(commentedAt);assertEquals("3 weeks ago", commentedAtFormatted);}@Testpublic void givenCommented1MonthAgo_thenFormatSays1MonthAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusMonths(1, now());String commentedAtFormatted = formatter.format(commentedAt);assertEquals("1 month ago", commentedAtFormatted);}@Testpublic void givenCommentedLessThan1YearAgo_thenFormatSaysXMonthsAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusMonths(11, minusWeeks(3, minusDays(6, minusHours(23, minusMinutes(59, now())))));String commentedAtFormatted = formatter.format(commentedAt);assertEquals("11 months ago", commentedAtFormatted);}@Testpublic void givenCommented1YearAgo_thenFormatSays1YearAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusYears(1, now());String commentedAtFormatted = formatter.format(commentedAt);assertEquals("1 year ago", commentedAtFormatted);}@Testpublic void givenCommentedOver1YearAgo_thenFormatSaysXYearsAgo() throws Exception {TimeStampFormatter formatter = new TimeStampFormatter();Date commentedAt = minusYears(2, minusMonths(11, minusWeeks(3, minusDays(6, minusHours(23, minusMinutes(59, now()))))));String commentedAtFormatted = formatter.format(commentedAt);assertEquals("2 years ago", commentedAtFormatted);}private Date minusSeconds(int seconds, Date date) {return minus(date, TimeUnit.SECONDS.toMillis(seconds));}private Date minusMinutes(int minutes, Date date) {return minus(date, TimeUnit.MINUTES.toMillis(minutes));}private Date minusHours(int hours, Date date) {return minus(date, TimeUnit.HOURS.toMillis(hours));}private Date minusDays(int days, Date date) {return minus(date, TimeUnit.DAYS.toMillis(days));}private Date minusWeeks(int weeks, Date date) {return minus(date, TimeUnit.DAYS.toMillis(weeks * DAYS_IN_A_WEEK));}private Date minusMonths(int months, Date date) {return minus(date, TimeUnit.DAYS.toMillis(months * AVERAGE_DAYS_IN_A_MONTH));}private Date minusYears(int years, Date date) {return minus(date, TimeUnit.DAYS.toMillis(years * DAYS_IN_YEAR));}private Date minus(Date date, long minutesInMillis) {date.setTime(date.getTime() - minutesInMillis);return date;}private Date now() {return new Date();}
}

  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在.net3.5中使用ListView控件和DataPager控件笔记

演练&#xff1a;使用 ListView Web 服务器控件修改数据 演练&#xff1a;使用 ListView Web 服务器控件对数据进行显示、分页和排序 DataPager 控件 注意DataPager控件只能和ListView控件使用,不能和其他数据绑定控件使用! 以下ListView 里面的代码都是按照上面链接里面说的步…

android lint工作机制,Android架构

MVCmvc model view controller 模式视图控制器M: 业务逻辑处理V&#xff1a;处理数据显示的部分C&#xff1a;Activity处理用户交互的问题&#xff0c;中间桥梁的作用&#xff0c;解耦的作用。特点&#xff1a;耦合性低扩展性好&#xff0c;利于维护模块职责划分明确Model层&am…

ComboBox 强制转换为大写的方法

最近遇到如何将输入在组合框&#xff08;ComboBox&#xff09;中的英文字符转换为大写的问题。 在TextBox中&#xff0c;有CharacterCasing属性&#xff0c;直接设置为Upper即可。但是在ComboBox中没有此属性&#xff0c;所以要另找其他方法。 直觉告诉我&#xff0c;一定是在K…

opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...

想必大家都知道&#xff0c;学习路线图是学习一门新技术的入门指南&#xff0c;让我们对技术有一个大概的了解&#xff0c;并且在学习感到困惑时被指导。所谓不求最好&#xff0c;但求最全。今天在在就给大家带来了一个国外大牛开源的项目 — 「developer-roadmap」&#xff0c…

数据的交换输出【杭电-2016】 附题

/* 数据的交换输出 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54495 Accepted Submission(s): 20688 Problem Description 输入n(n<100)个数。找出当中最小的数&#xff0c;将它与最前面的数交换后输出…

进程速查手册

进程速查手册 什么是系统进程&#xff1f;它能做什么&#xff1f; 进程是程序在计算机上的一次执行活动。当你运行一个程序&#xff0c;你就启动了一个进程。显然&#xff0c;程序是死的(静态的)&#xff0c;进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成…

android画布一闪一闪的,解决Android SurfaceView绘制触摸轨迹闪烁问题的方法

本文分享了解决SurfaceView触摸轨迹闪烁问题的方法&#xff0c;供大家参考&#xff0c;具体内容如下第一种解决SurfaceView触摸轨迹闪烁问题的方法&#xff1a;由于SurfaceView使用双缓存机制&#xff0c;两张画布轮流显示到屏幕上。那么&#xff0c;要存储触摸轨迹并避免两张画…

iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

iOS应用&#xff08;包括移动应用&#xff09;的网络分析&#xff0c;一般采用将移动设备上的流量导入到PC机上&#xff0c;利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法。 总的来说&#xff0c;有以下三种方法&#xff1a;一、在PC上设置网络共享&#xff0c…

开端2(三)

选择行数, if (efGridResult.EFChoiceCount < 1)设为选中,,this.efGridResult[this.efGridResult.Rows.Count - 1, "check_option"] true;取数据, inInfo.SetBlockVal(this.efGridResult);弹出菜单 this.efGridResult.EFAllowMenuNew false;新增一空行 th…

利用DBMS_ADVISOR.TUNE_MVIEW包生成物化视图创建语句

不少人大概和我一样在创建物化视图的时候会犯头痛&#xff0c;怎样合理的改写SQL语句以及添加物化视图日志需要经过慎重精密的考虑。有了DBMS_ADVISOR.TUNE_MVIEW存储过程这个帮手后&#xff0c;极大地方便了DBA或应用设计人员创建和优化物化视图。该TUNE_MVIEW存储过程可以做到…

oracle批量update数据_东方国信大数据面试真题

东方国信学长1Hadoop工程师笔试题&#xff08;金融事业部&#xff09;1&#xff09;技术基础题&#xff08;共十题&#xff0c;每题5分&#xff09;&#xff08;1&#xff09;列举在Linux系统下可以在看系统各项性能的工具&#xff08;区分CPU、内存、硬盘、网络等&#xff09;…

android 搜狗地图包名,搜狗地图(免费语音导航)

权限信息 读取您的USB存储设备中的内容 android.permission.REQUEST_INSTALL_PACKAComGES android.permission.RECEIVE_USER_PRESENT 完全的网络访问权限 android.permission.ACCESS_BACKGROUND_LOCATION 大致位置(基于网络) 精确位置(基于GPS和网络) 查看网络连接 修改或删除您…

eclipse定制化配置调优、初始化配置指南、可以解决启动慢等问题

配置eclipse的jvm参数 打开eclipse根目录下的eclipse.ini在最后面加上如下的jvm参数 -Xms400m -Xmx1400m -XX:NewSize128m -XX:MaxNewSize512m -XX:PermSize96m -XX:MaxPermSize128m -server -XX:CompileThreshold100 -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatin…

SEC SOC Test Board 在WIN 7下的安装

首先找到“设备和打印机”点击打开 如果你插上了USB线&#xff0c;会看到&#xff0c;安装不成功时会有个“&#xff01;” 双击它&#xff0c;出现 点击“属性”&#xff0c;出现 点击“改变设置”&#xff0c;出现 点击“更新驱动程序”&#xff0c;出现 点击进去&#xff0c…

ora-00054:resource busy and acquire with nowait specified解决方法

当某个数据库用户在数据库中插入、更新、删除一个表的数据&#xff0c;或者增加一个表的主键时或者表的索引时&#xff0c;常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。主要是因为有事务正在执行&#xff08;或者事务已经被锁&#xff09…

吴枫 python小课怎么样_编程中,有哪些好的习惯从一开始就值得坚持?

电影《喜剧之王》里&#xff0c;周星驰饰演的尹天仇&#xff0c;是一个渴望成为真正的演员&#xff0c;却不断沦为落魄跑龙套的小人物。即便如此&#xff0c;他对演戏的态度始终认真而可敬。他每天不但锲而不舍寻找演戏机会&#xff0c;还在街坊福利社开了个戏剧训练班&#xf…

android常用控件实验报告,ui设计实验报告.doc

ui设计实验报告ui设计实验报告篇一&#xff1a;UI设计实验报告实验项目四&#xff1a;UI设计一、 实验目的和要求1、熟练运用Eclipse软件中的swing设计。2、掌握UI编写的软件。3、能都熟练的进行操作&#xff0c;理解每个按钮的含义并懂得修改参数。4、理解其幕后的Java代码。二…

星期三,今天早上上了四节JS课程,下午听健康讲座,晚上装系统

星期三&#xff0c;今天早上上了四节JS课程&#xff0c;下午听健康讲座&#xff0c;晚上装系统。我想说装系统是最浪费时间的&#xff0c;以前大一的时候&#xff0c;有一段时间喜欢上装系统&#xff0c;我去有时候一个系统装了两三天&#xff0c;因为有很多问题。 ~ 后面就不研…

在欲而无欲,居尘不染尘

僧人竺法深在东晋简文帝处作客&#xff0c;刘尹问&#xff1a;「法师是学道之人&#xff0c;为什么要来官宦之门中走动&#xff1f;」竺法深回答说&#xff1a;「你自见这是朱门高第&#xff0c;在贫道眼里&#xff0c;同走在茅屋草舍间并无任何差别。」   法师的境界&#x…

设置width不生效_关于padding被计算在width中问题——box-sizing相关

前一阵子遇到一个小问题&#xff0c;在同样的样式&#xff08;主要是宽高边距之类的&#xff09;条件下&#xff0c;DIV在移动端和PC端的宽度不一样&#xff0c;排除了绝大多数样式的问题&#xff0c;但是有个比较陌生&#xff0c;就是box-sizing&#xff0c;其实经常看到&…