前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自定义 java 日期、时间 处理函数集

自定义 java 日期、时间 处理函数集

作者头像
用户1177713
发布2018-02-24 12:14:39
8470
发布2018-02-24 12:14:39
举报
文章被收录于专栏:数据之美数据之美

废话少说,在shell下很容易:

june@deepin :~> date -d@1353027149 2012年 11月 16日 星期五 08:52:29 CST june@deepin :~>

但是 java 下比较折腾,网上转来抄去的代码也都是错误一大堆。。。

java代码如下:

代码语言:javascript
复制
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

public class MyDateUtil {

	public static String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; // 注意 HH 和 hh 的区别!
	public static String DATE_FORMAT = "yyyyMMdd";

	// 计算起始日期间隔多少天
	public static String getDayInterval(String st, String ed) {
		SimpleDateFormat myFormatter = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");
		long day = 0;
		try {
			java.util.Date startDate = myFormatter.parse(st);
			java.util.Date endDate = myFormatter.parse(ed);
			day = (endDate.getTime() - startDate.getTime())
					/ (24 * 60 * 60 * 1000);
		} catch (Exception e) {
			return "";
		}
		return day + "";
	}

	// 判断起始时间差是否在多少分钟内
	public static boolean getMinitueInterval(String st, String ed, int mins) {
		SimpleDateFormat myFormatter = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");
		boolean inMins = false;
		try {
			java.util.Date startDate = myFormatter.parse(st);
			java.util.Date endDate = myFormatter.parse(ed);
			double minitue = (endDate.getTime() * 1.0 - startDate.getTime())
					/ (60 * 1000);
			System.out.println(minitue);
			if (minitue >= 0 && minitue <= mins) {
				inMins = true;
			} else {
				inMins = false;
			}

		} catch (Exception e) {
			inMins = false;
		}
		return inMins;
	}

	// 指定日期 N 天以前的日期
	public static String getNDaysAgo(String date, int nDaysAgo) {
		Calendar cal1 = Calendar.getInstance();
		Date dateFormat = null;
		try {
			dateFormat = new SimpleDateFormat(DATE_FORMAT).parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		Long dateLong = dateFormat.getTime(); // 得到的是 long,类似 date
												// -d"2012-11-12 12:00:00" +%s
		cal1.setTime(new java.util.Date(dateLong));
		cal1.add(Calendar.DATE, -nDaysAgo);
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		return formatter.format(cal1.getTime());
	}

	// 得到起始范围内的日期列表,包含起始日期,可设置间隔天数
	public static List<String> getDateList(String startDate, String endDate,
			int intervalDay) {
		List<String> listDate = new ArrayList<String>();

		SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
		Date dBegin;
		Date dEnd;
		try {
			dBegin = f.parse(startDate);
			dEnd = f.parse(endDate);
			if (dBegin.getTime() <= dEnd.getTime()) {
				for (long i = dBegin.getTime(); i <= dEnd.getTime(); i += 86400000 * (intervalDay + 1)) {
					Date d = new Date(i);
					String date = f.format(d);
					// System.out.println(date);
					listDate.add(date);
				}
			} else {
				for (long i = dBegin.getTime(); i >= dEnd.getTime(); i -= 86400000 * (intervalDay + 1)) {
					Date d = new Date(i);
					String date = f.format(d);
					// System.out.println(date);
					listDate.add(date);
				}
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return listDate;
	}

	// 获取指定日期的前一周(1~7天)时间
	public static List<String> getWeekList(String startDate) {
		List<String> listDate = new ArrayList<String>();

		SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
		Date dBegin;
		try {
			dBegin = f.parse(startDate);
			for (long i = 1; i <= 7; i++) {
				Date d = new Date(dBegin.getTime() - 86400000 * i);
				String date = f.format(d);
				// System.out.println(date);
				listDate.add(date);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return listDate;
	}

	// 将长整型字符串转换为日期字符串,注意:不能带毫秒
	public static String millis2Time(String longStr) {
		long seconds = Long.parseLong(longStr);
		long millis = seconds * 1000;
		Date date = new Date(millis);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
				Locale.CHINA);
		sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		String formattedDate = sdf.format(date);
		return formattedDate;
	}

	// 将日期字符串转换为长整型数字,注意:输出不带毫秒
	public static long time2Millis(String date) {
		Date dateFormat = null;
		try {
			dateFormat = new SimpleDateFormat(TIME_FORMAT).parse(date);
		} catch (ParseException e) {
			System.out.println(e.toString());
		}
		Long dateLong = dateFormat.getTime(); // 得到的是 long,类似 date
												// -d"2012-11-12 12:00:00" +%s
		return dateLong;
	}

	// 得到指定日期的星期数,注意:1=星期日 2=星期一 7=星期六,其他类推
	public static String getWeek(String sdate) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		ParsePosition pos = new ParsePosition(0);
		Date strtodate = formatter.parse(sdate, pos);
		// Date date = strToDate(sdate);
		Calendar c = Calendar.getInstance();
		c.setTime(strtodate);
		// int hour=c.get(Calendar.DAY_OF_WEEK);
		// hour中存的就是星期几了,其范围 1~7
		// 1=星期日 2=星期一 7=星期六,其他类推
		// return new SimpleDateFormat("E").format(c.getTime()); // 返回 星期一
		return String.valueOf(c.get(Calendar.DAY_OF_WEEK));
	}

	// 得到 1 年以前的日期
	public static String getOneYearsAgo(String dateStr) {
		SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
		Calendar cal = Calendar.getInstance();
		try {
			cal.setTime(f.parse(dateStr));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		cal.add(Calendar.YEAR, -1);
		Date oneYearsAgo = cal.getTime();
		return f.format(oneYearsAgo);
	}

	// 得到 N 个月以前的日期
	public static String getNMonthsAgo(String dateStr, int n) {
		SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
		Calendar cal = Calendar.getInstance();
		try {
			cal.setTime(f.parse(dateStr));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		cal.add(Calendar.MONTH, n);
		Date nMonthsAgo = cal.getTime();
		return f.format(nMonthsAgo);
	}

	// 获得上月最后一天的日期
	public static String getPreMonthEnd(String dateStr) {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		Calendar lastDate = Calendar.getInstance();
		try {
			lastDate.setTime(sdf.parse(dateStr));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		lastDate.add(Calendar.MONTH, -1);// 减一个月
		lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		lastDate.roll(Calendar.DATE, -1);// 日期回滚一天,也就是本月最后一天
		str = sdf.format(lastDate.getTime());
		return str;
	}

	// 获得上月最第一天的日期
	public static String getPreMonthFirst(String dateStr) {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		Calendar lastDate = Calendar.getInstance();
		try {
			lastDate.setTime(sdf.parse(dateStr));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
		lastDate.add(Calendar.MONTH, -1);// 减一个月,变为下月的1号
		str = sdf.format(lastDate.getTime());
		return str;
	}

	public static void main(String[] args) {

		// List<String> dateList = getDateList("20130108", "20130107", 0);
		// for (String date : dateList) {
		// System.out.println(date);
		// }

		// List<String> dateList = getWeekList("20121112");
		// for(String date : dateList){
		// System.out.println(date);
		// }

		// System.out.println(millis2Time("1318521600"));

		// System.out.println(time2Millis("2012-12-16 00:05:13")/1000/60);

		// System.out.println(getNDaysAgo("20130114", 1));
		// System.out.println(getNDaysAgo("20130114", 7));

		System.out.println(getWeek("20130122"));

		// System.out.println(getOneYearsAgo("20120227"));

		// System.out.println(getNMonthsAgo("20110827", -6));
		// System.out.println(getNMonthsAgo("20110829", -6));
		// System.out.println(getNMonthsAgo("20120229", -12));

		// System.out.println("20110827".substring(6, 8));

		// System.out.println(getPreMonthFirst("20130430"));

		// System.out.println(getMinitueInterval("2012-12-16 00:05:13",
		// "2012-12-16 00:10:13", 5));
	}
}

结果:

2012-11-16 08:52:29

___________________________________________________

PS:

关于 SimpleDateFormat 的非线程安全问题及其解决方案

http://my.oschina.net/leejun2005/blog/152253#OSC_h4_7

JAVA获取各种各样的时间、时间对比 方法汇总

http://hechuanzhen.iteye.com/blog/1736740

用于处理java当中各种使用到日期的方法

http://lushuifa.iteye.com/blog/1781819

Java日期计算之Joda-Time

http://rensanning.iteye.com/blog/1546652

http://persevere.iteye.com/blog/1755237

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档