自己用到过的时间方法
package com.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
/**
* 操作时间、日期的工具类
*/
public class DateUtil {
public static SimpleDateFormat daydf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public static SimpleDateFormat ym = new SimpleDateFormat("yyyy-MM");
private DateUtil(){}
/**
* 格式化字符串为日期
* @param day 字符串格式为yyyy-MM-dd
* @return 日期 Date对象
*/
public static java.util.Date formatDayTime(String day){
try {
return sdf.parse(day);
} catch (ParseException ex) {
ex.printStackTrace();
return new java.util.Date();
}
}
public static Date formatToDate(String day){
try {
return daydf.parse(day);
} catch (ParseException ex) {
ex.printStackTrace();
return new java.util.Date();
}
}
/**
* 格式字符串为某年某月的第一天。
* @param yearmonth 格式为2008-10
* @return 某年某月的第一天
*/
public static java.util.Date formatMonthTime(String yearmonth){
try {
return sdf.parse(yearmonth + "-01");
} catch (ParseException ex) {
ex.printStackTrace();
return new java.util.Date();
}
}
/**
*
* @return
* @throws ParseException
*/
public static String lastDayOfMonth(String yearMonth) throws ParseException{
Calendar calendar=Calendar.getInstance();
Calendar cpcalendar=(Calendar)calendar.clone();
cpcalendar.setTime(ym.parse(yearMonth));
cpcalendar.add(Calendar.MONTH, 1);
cpcalendar.add(Calendar.DATE, -1);
String date = sdf.format(cpcalendar.getTime());
return date;
}
/**
* 获取当前月有多少天
* @return
*/
public static int getDayOfMonth(){
Calendar c = Calendar.getInstance(Locale.CHINA);
int countDay = c.getActualMaximum(Calendar.DATE);
return countDay;
}
/**
*返回自1970年1月1日00:00:00GMT以来此日期对象表示的毫秒数
*@param str 格式为yyyy-MM-dd
*/
public static long parseDayByYYYYMMDD(String str){
try {
return sdf.parse(str).getTime();
} catch (Exception ex) {
return 0L;
}
}
/**
*返回自1970年1月1日00:00:00GMT以来此时间对象表示的秒数
*@param str 格式为yyyy-MM-dd HH:mm:ss
*/
public static int parseTimeByYYYYMMDDHHMMSS(String str){
if(str == null || str.length() != 19) return 0;
try {
return (int)(daydf.parse(str).getTime()/1000L);
} catch (Exception ex) {
return 0;
}
}
/**
* 得到 yyyy-MM-dd 格式的指定日期的前一天
*/
public static String foreDay(String day){
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(parseDayByYYYYMMDD(day));
cal.add(Calendar.DAY_OF_MONTH, -1);
return sdf.format(cal.getTime());
}
/**
* 根据时间值构造日期
*/
public static String parseDay(int time){
return sdf.format(new java.util.Date(time*1000L));
}
/**
* 显示时间
* @param millseconds 毫秒数
* @return 时间显示
*/
public static String displayTime(long millseconds) {
if(millseconds < 1000) return millseconds+" ms";
int seconds = (int)(millseconds/1000);
if(seconds < 60) return seconds+" s";
if(seconds < 60*60) return seconds/60+"m"+seconds%60+"s";
int m = seconds -(seconds/3600)*3600;
if(seconds < 24*60*60) return seconds/3600+"h"+m/60+"m"+m%60+"s";
return millseconds+" ms";
}
/**
* 转换成yyyy-MM-dd格式的日期字符串
* @param d Date对象
*/
public static String formatDay(java.util.Date d){
return sdf.format(d);
}
/**
* 转换成yyyy-MM-dd格式的日期字符串
* @param d Calendar对象
*/
public static String formatDay(java.util.Calendar d){
return sdf.format(d.getTime());
}
/**
* 转换成yyyy-MM-dd HH:mm:ss格式的时间
* @param time 毫秒数
*/
public static String formatyyyyMMddHHmmss(long time){
return daydf.format(new java.util.Date(time));
}
/**
* 转换成yyyy-MM-dd HH:mm:ss格式的时间
* @param time 毫秒数
*/
public static String formatyyyyMMdd(long time){
return sdf.format(new java.util.Date(time));
}
/**
* 将时间转换成yyyy-MM-dd HH:mm:ss的格式字符串。
* @param time 时间对象
* @return 格式化后的字符串,当输入为null时输出为""
*/
public static String formatyyyyMMddHHmmss(Date time){
if(time==null){
return "";
}
try{
return daydf.format(time);
}
catch(Exception ex){
return "";
}
}
/**
* 当前日期
* @return yyyy-MM-dd格式的当前日期
*/
public static String today() {
return sdf.format(new java.util.Date());
}
/**
* 当前日期的前一天
* @return 当前日期的前一天
*/
public static String yesterday(){
java.util.Calendar cal =java.util.Calendar.getInstance();
cal.add(java.util.Calendar.DAY_OF_MONTH, -1);
return sdf.format(cal.getTime());
}
/**
* 当前日期的下一天
* @return 当前日期的下一天
*/
public static String tomorrow(){
java.util.Calendar cal =java.util.Calendar.getInstance();
cal.add(java.util.Calendar.DAY_OF_MONTH, 1);
return sdf.format(cal.getTime());
}
/**
* 返回本月1号
* @return 返回本月1号
*/
public static String currmonth1day(){
java.util.Calendar cal =java.util.Calendar.getInstance();
cal.set(java.util.Calendar.DAY_OF_MONTH, 1);
return sdf.format(cal.getTime());
}
/**
* 返回本月最后一天
*/
public static String lastDayOfMonth(){
Calendar calendar=Calendar.getInstance();
Calendar cpcalendar=(Calendar)calendar.clone();
cpcalendar.set(Calendar.DAY_OF_MONTH,1);
cpcalendar.add(Calendar.MONTH, 1);
cpcalendar.add(Calendar.DATE, -1);
String date = sdf.format( new Date(cpcalendar.getTimeInMillis()));
return date;
}
/**
* 给指定时间加上一个数值
* @param time1 要加上一数值的时间,为null即为当前时间,格式为yyyy-MM-dd HH:mm:ss
* @param addpart 要加的部分:年月日时分秒分别为:YMDHFS
* @param num 要加的数值
* @return 新时间,格式为yyyy-MM-dd HH:mm:ss
*/
public static String addTime(String time1,String addpart,int num){
try{
String now = daydf.format(new Date());
time1 = (time1 == null) ? now : time1;
if (time1.length() < 19){
time1 += " 00:00:00";
}
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(daydf.parse(time1));
if (addpart.equalsIgnoreCase("Y")){
cal.add(Calendar.YEAR,num);
}else if (addpart.equalsIgnoreCase("M")){
cal.add(Calendar.MONTH,num);
}else if (addpart.equalsIgnoreCase("D")){
cal.add(Calendar.DATE,num);
}else if (addpart.equalsIgnoreCase("H")){
cal.add(Calendar.HOUR,num);
}else if (addpart.equalsIgnoreCase("F")){
cal.add(Calendar.MINUTE,num);
}else if (addpart.equalsIgnoreCase("S")){
cal.add(Calendar.SECOND,num);
}
return daydf.format(cal.getTime());
}
catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* 给指定日期加上一个数值
* @param date1 要加上一数值的日期,为null即为当前日期,格式为yyyy-MM-dd
* @param addpart 要加的部分:年月日分别为:YMD
* @param num 要加的数值
* @return 新日期,格式为yyyy-MM-dd
*/
public static String addDate(String date1,String addpart,int num){
return addTime(date1,addpart,num).substring(0,10);
}
/**
* 当前日期
* @return yyyy-MM-dd HH:mm:ss格式的当前日期
*/
public static String now() {
return daydf.format(new java.util.Date());
}
/**
* 返回当前时间
*/
public static String timeofnow(){
Calendar curcal = Calendar.getInstance();
return daydf.format(curcal.getTime());
}
/**
* 得到距离当前天几天的日期表达,格式为1985-12-20。
* @param step 天数。例如-10表示十天前
* @return
*/
public static String dateofSepcial(int step) {
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.add(java.util.Calendar.DAY_OF_MONTH, step);
return sdf.format(cal.getTime());
}
/**
* UNIX时间x
* @return
*/
public static String getCurrUnixtimestamp(){
String ret = "";
try {
Date date = daydf.parse("1970-01-01 00:00:00");
long l = (new Date().getTime() - date.getTime())/1000;
ret = String.valueOf(l);
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
/**
* 比较时间大小,精确到时分秒
*/
public static boolean compareDateYYYYMMDDHHmmss(String date1, String date2) {
try {
Date dt1 = daydf.parse(date1);
Date dt2 = daydf.parse(date2);
if (dt1.getTime() >= dt2.getTime()) {
return true;
} else if (dt1.getTime() < dt2.getTime()) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 比较时间大小,精确到天
*/
public static boolean compareDateYYYYMMDD(String date1, String date2) {
try {
Date dt1 = sdf.parse(date1);
Date dt2 = sdf.parse(date2);
if (dt1.getTime() >= dt2.getTime()) {
return true;
} else if (dt1.getTime() < dt2.getTime()) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 计算两日期的差的天数
* @param smdate 开始日期
* @param bdate 结束日期
*/
public static int daysBetween(String smdate,String bdate) {
int num = 0;
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(smdate));
long time1 = cal.getTimeInMillis();
cal.setTime(sdf.parse(bdate));
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
num = Integer.parseInt(String.valueOf(between_days));
} catch (Exception e) {
e.printStackTrace();
}
return num;
}
/**
* 获取传入时间,所在年的周数
* @param date
* @return
*/
public static int getWeekOfYear(String dateStr) {
//简单时间格式话类
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = simpleDateFormat.parse(dateStr);
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setMinimalDaysInFirstWeek(7);
c.setTime(date);
return c.get(Calendar.WEEK_OF_YEAR);
} catch (ParseException e) {
e.printStackTrace();
}
return 1;
}
/**
* 获取当前年的最大周数
* @param year
* @return
*/
public static int getMaxWeekNumOfYear(int year) {
//简单时间格式话类
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
Calendar c = new GregorianCalendar();
c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);
return getWeekOfYear(simpleDateFormat.format(c.getTime()));
}
/**
* 获取某年的第几周的开始日期
* @param year
* @param week
* @return
*/
public static String getFirstDayOfYearOrWeek(int year, int week) {
//简单时间格式话类
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
Calendar c = new GregorianCalendar();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, Calendar.JANUARY);
c.set(Calendar.DATE, 1);
Calendar cal = (GregorianCalendar) c.clone();
cal.add(Calendar.DATE, week * 7);
return getFirstDayOfWeek(simpleDateFormat.format(cal.getTime()));
}
/**
* 获取当前时间所在周的开始日期
* @param dateStr
* @return
*/
public static String getFirstDayOfWeek(String dateStr) {
//简单时间格式话类
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
try {
//将字符串格式话为时间
Date date = simpleDateFormat.parse(dateStr);
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(date);
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); //Monday
return simpleDateFormat.format(c.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取输入时间,相同周数、相同星期几、去年的日期
* @param thisDate
* @return
*/
public static String getPastWeekEqualDate(String thisDate){
//简单时间格式话类
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
try {
date = simpleDateFormat.parse(thisDate);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
//设置时间
cal.setTimeInMillis(date.getTime());
//获取当前年份
int year = cal.get(Calendar.YEAR);
//获取当前在今年的周数
int startTimeWeek = DateUtil.getWeekOfYear(thisDate);
//获取当前日期所在周的开始日期
String thisWeekDate = DateUtil.getFirstDayOfYearOrWeek(year,startTimeWeek);
//计算输入日期与所在周第一天的差值
int insertDiffer =DateUtil.daysBetween(thisWeekDate,thisDate);
//获取去年的最大周树
int pastYearMaxWeek = DateUtil.getMaxWeekNumOfYear(year-1);
//如果去年没有当前周,则周数减1
if(startTimeWeek > pastYearMaxWeek){
startTimeWeek = startTimeWeek -1;
}
//获取去年的同周数的,第一天
String paseYearWeekOneDdy = DateUtil.getFirstDayOfYearOrWeek(year-1,startTimeWeek);
//得到去年相同周数的相同的日期
String pastWeekStartDate = DateUtil.addDate(paseYearWeekOneDdy, "D", insertDiffer);
return pastWeekStartDate;
}
/**
* 测试
*/
public static void main(String[] args) throws ParseException {
String thisDate = "2015-07-29";
//简单时间格式话类
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
Date date = simpleDateFormat.parse(thisDate);
Calendar cal = Calendar.getInstance();
//设置时间
cal.setTimeInMillis(date.getTime());
//获取当前年份
int year = cal.get(Calendar.YEAR);
//获取当前在今年的周数
int startTimeWeek = DateUtil.getWeekOfYear(thisDate);
System.out.println("当前周数:" + startTimeWeek);
//获取去年的最大周树
int pastYearMaxWeek = DateUtil.getMaxWeekNumOfYear(year-1);
System.out.println("去年最大周数:" + pastYearMaxWeek);
//如果去年没有当前周,则周数减1
if(startTimeWeek > pastYearMaxWeek){
startTimeWeek = startTimeWeek -1;
}
//获取当前日期所在周的开始日期
String thisWeekDate = DateUtil.getFirstDayOfYearOrWeek(year,startTimeWeek);
System.out.println("当前日期所在周的第一天日期:" + thisWeekDate);
//获取去年的同周数的,第一天
String paseYearWeekOneDdy = DateUtil.getFirstDayOfYearOrWeek(year-1,startTimeWeek);
System.out.println("去年相同周岁的第一天日期:" + paseYearWeekOneDdy);
//计算输入时间所在的周,与当前周的第一天的天数差
int insertDiffer =DateUtil.daysBetween(thisWeekDate,thisDate);
System.out.println("输入日期和输入日期所在周的第一天相差天数:" + insertDiffer);
//得到去年相同周数的相同的日期
String pastWeekDate = DateUtil.addDate(paseYearWeekOneDdy, "D", insertDiffer);
System.out.println("去年相同周岁相同日期:" + pastWeekDate);
}
}