转自:https://cnblogs.com/ityouknow/p/5662753.html
功能
Date与String之间的互相转换,以及一些特殊格式的时间字符串处理
代码
1 /** 2 * 类名:TimeUtil.java 类描述:时间处理工具 3 * 4 * @author wader 创建时间:2011-12-02 11:03 5 */ 6 public class TimeUtil { 7 public final static String FORMAT_DATE = "yyyy-MM-dd"; 8 public final static String FORMAT_TIME = "hh:mm"; 9 public final static String FORMAT_DATE_TIME = "yyyy-MM-dd hh:mm"; 10 public final static String FORMAT_MONTH_DAY_TIME = "MM月dd日 hh:mm"; 11 private static SimpleDateFormat sdf = new SimpleDateFormat(); 12 private static final int YEAR = 365 * 24 * 60 * 60;// 年 13 private static final int MONTH = 30 * 24 * 60 * 60;// 月 14 private static final int DAY = 24 * 60 * 60;// 天 15 private static final int HOUR = 60 * 60;// 小时 16 private static final int MINUTE = 60;// 分钟 17 18 /** 19 * 根据时间戳获取描述性时间,如3分钟前,1天前 20 * 21 * @param timestamp 22 * 时间戳 单位为毫秒 23 * @return 时间字符串 24 */ 25 public static String getDescriptionTimeFromTimestamp(long timestamp) { 26 long currentTime = System.currentTimeMillis(); 27 long timeGap = (currentTime - timestamp) / 1000;// 与现在时间相差秒数 28 System.out.println("timeGap: " + timeGap); 29 String timeStr = null; 30 if (timeGap > YEAR) { 31 timeStr = timeGap / YEAR + "年前"; 32 } else if (timeGap > MONTH) { 33 timeStr = timeGap / MONTH + "个月前"; 34 } else if (timeGap > DAY) { // 1天以上 35 timeStr = timeGap / DAY + "天前"; 36 } else if (timeGap > HOUR) { // 1小时-24小时 37 timeStr = timeGap / HOUR + "小时前"; 38 } else if (timeGap > MINUTE) { // 1分钟-59分钟 39 timeStr = timeGap / MINUTE + "分钟前"; 40 } else { // 1秒钟-59秒钟 41 timeStr = "刚刚"; 42 } 43 return timeStr; 44 } 45 46 /** 47 * 根据时间戳获取指定格式的时间,如2011-11-30 08:40 48 * 49 * @param timestamp 50 * 时间戳 单位为毫秒 51 * @param format 52 * 指定格式 如果为null或空串则使用默认格式"yyyy-MM-dd HH:MM" 53 * @return 54 */ 55 public static String getFormatTimeFromTimestamp(long timestamp, 56 String format) { 57 if (format == null || format.trim().equals("")) { 58 sdf.applyPattern(FORMAT_DATE); 59 int currentYear = Calendar.getInstance().get(Calendar.YEAR); 60 int year = Integer.valueOf(sdf.format(new Date(timestamp)) 61 .substring(0, 4)); 62 System.out.println("currentYear: "+currentYear); 63 System.out.println("year: "+year); 64 if (currentYear == year) { //如果为今年则不显示年份 65 sdf.applyPattern(FORMAT_MONTH_DAY_TIME); 66 } else { 67 sdf.applyPattern(FORMAT_DATE_TIME); 68 } 69 } else { 70 sdf.applyPattern(format); 71 } 72 Date date = new Date(timestamp); 73 return sdf.format(date); 74 } 75 76 /** 77 * 根据时间戳获取时间字符串,并根据指定的时间分割数partionSeconds来自动判断返回描述性时间还是指定格式的时间 78 * 79 * @param timestamp 80 * 时间戳 单位是毫秒 81 * @param partionSeconds 82 * 时间分割线,当现在时间与指定的时间戳的秒数差大于这个分割线时则返回指定格式时间,否则返回描述性时间 83 * @param format 84 * @return 85 */ 86 public static String getMixTimeFromTimestamp(long timestamp, 87 long partionSeconds, String format) { 88 long currentTime = System.currentTimeMillis(); 89 long timeGap = (currentTime - timestamp) / 1000;// 与现在时间相差秒数 90 if (timeGap <= partionSeconds) { 91 return getDescriptionTimeFromTimestamp(timestamp); 92 } else { 93 return getFormatTimeFromTimestamp(timestamp, format); 94 } 95 } 96 97 /** 98 * 获取当前日期的指定格式的字符串 99 *100 * @param format101 * 指定的日期时间格式,若为null或""则使用指定的格式"yyyy-MM-dd HH:MM"102 * @return103 */104 public static String getCurrentTime(String format) {105 if (format == null || format.trim().equals("")) {106 sdf.applyPattern(FORMAT_DATE_TIME);107 } else {108 sdf.applyPattern(format);109 }110 return sdf.format(new Date());111 }112 113 /**114 * 将日期字符串以指定格式转换为Date115 *116 * @param time117 * 日期字符串118 * @param format119 * 指定的日期格式,若为null或""则使用指定的格式"yyyy-MM-dd HH:MM"120 * @return121 */122 public static Date getTimeFromString(String timeStr, String format) {123 if (format == null || format.trim().equals("")) {124 sdf.applyPattern(FORMAT_DATE_TIME);125 } else {126 sdf.applyPattern(format);127 }128 try {129 return sdf.parse(timeStr);130 } catch (ParseException e) {131 return new Date();132 }133 }134 135 /**136 * 将Date以指定格式转换为日期时间字符串137 *138 * @param date139 * 日期140 * @param format141 * 指定的日期时间格式,若为null或""则使用指定的格式"yyyy-MM-dd HH:MM"142 * @return143 */144 public static String getStringFromTime(Date time, String format) {145 if (format == null || format.trim().equals("")) {146 sdf.applyPattern(FORMAT_DATE_TIME);147 } else {148 sdf.applyPattern(format);149 }150 return sdf.format(time);151 }152 }
使用范例
1 public class Test { 2 public static void main(String[] args) { 3 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 4 String timeStr = "2010-11-30 10:12:23"; 5 try { 6 Date date = sdf.parse(timeStr); 7 8 System.out.println(TimeUtil.getDescriptionTimeFromTimestamp(date 9 .getTime()));10 System.out.println(TimeUtil.getDescriptionTimeFromTimestamp(new Date()11 .getTime()));12 13 System.out.println(TimeUtil.getFormatTimeFromTimestamp(date.getTime(),14 "yyyy年MM月dd日"));15 System.out.println(TimeUtil.getFormatTimeFromTimestamp(date.getTime(),16 null));17 System.out.println(TimeUtil.getFormatTimeFromTimestamp(new Date().getTime(),18 null));19 20 System.out.println(TimeUtil.getMixTimeFromTimestamp(date.getTime(),21 3*24 * 60 * 60, "yyyy年MM月dd日 hh:mm"));22 System.out.println(TimeUtil.getMixTimeFromTimestamp(date.getTime(),23 24 * 60 * 60, null)); 24 System.out.println(TimeUtil.getMixTimeFromTimestamp(new Date().getTime(),25 3*24 * 60 * 60, "yyyy年MM月dd日 hh:mm"));26 27 } catch (ParseException e) {28 e.printStackTrace();29 }30 31 }32 }33 34 输出结果35 36 1年前37 刚刚38 2010年11月30日39 2010-11-30 10:1240 12月02日 01:2141 2010年11月30日 10:1242 2010-11-30 10:12