工作中有关对 日期及时间 操作的方法总结

1.JS  时间戳 转 日期字符串

(一)

function getMyDate(timestamp){  
	var oDate = new Date(timestamp),  
	oYear = oDate.getFullYear(),  
	oMonth = oDate.getMonth()+1,  
	oDay = oDate.getDate(),  
	oHour = oDate.getHours(),  
	oMin = oDate.getMinutes(),  
	oSen = oDate.getSeconds(),  
	oTime = oYear +'-'+ check(oMonth) +'-'+ check(oDay) +' '+ check(oHour) +':'+ check(oMin) +':'+check(oSen); 
	return oTime;  
};

function check(m){
    return m<10?'0'+m:m; 
}

(二)

var format = function(timestamp, format) {
	var t = new Date(time);
	var tf = function(i) {
		return(i < 10 ? '0' : '') + i
	};
	return format.replace(/yyyy|MM|dd|HH|mm|ss/g, function(a) {
		switch(a) {
		case 'yyyy':
			return tf(t.getFullYear());
			break;
		case 'MM':
			return tf(t.getMonth() + 1);
			break;
		case 'dd':
			return tf(t.getDate());
			break;
		case 'HH':
			return tf(t.getHours() + 1)
			break;
		case 'mm':
			return tf(t.getMinutes())
			break;
		case 'ss':
			return tf(t.getSeconds())
			break;
		};
	});
};

2. JS  获取指定时间后的日期时间

//num 当前时间后的时间段(数量) 
//type  1 天  2 月份 3  年   
function getNextDate(num,type){  
      var oDate = new Date();
      if(type==1)
         oDate=oDate.setDate(oDate.getDate()+num);
      if(type==2)
         oDate=oDate.setMonth(oDate.getMonth()+num);
      if(type==3)
	     oDate=oDate.setFullYear(oDate.getFullYear()+num);
      return oDate;		   ;  
}

3. JS   日期字符串 转 时间戳

//var str = "2014-07-10 10:21:12";
function getMyTimestamp(str){ 
    var timestamp = Date.parse(new Date(str));
    timestamp = timestamp / 1000;
    return timestamp;
}

4. 使用SpringMVC时,当前台日期的文本输入框是String,而实际对象属性是Date时,序列化对象后到后台会报错.

(一)在Controller中加入该框架自身的转化注解:

@InitBinder
public void initBinder(WebDataBinder binder) {
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     dateFormat.setLenient(false);
     binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));//true:允许输入空值,false:不能为空值
}

(二)使用注解@DateTimeFormat(): 在需要绑定的实体类的属性或者setter()方法上添加该注解       

//Spring4升级了这个转换框架以支持Java8日期与时间API里的那些类,
//如:Spring 4能接受一个字符串参数例如2014-02-01并将它转换成Java8 LocalDate的实例
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;

5. fastjson对Date的处理:对日期的序列化.

//第一种方法是通过注解(使用关联表后该注解失效):
@JSONField (format="yyyy-MM-dd HH:mm:ss")  
public Date birthday;

//第二种是通过SerializeConfig:
public class JsonUtil {    
    private static SerializeConfig mapping = new SerializeConfig();    
    private static String dateFormat;    
    static {    
        dateFormat = "yyyy-MM-dd HH:mm:ss";    
    }    
     
    /**  
     * 默认的处理时间  
     *   
     * @param jsonText  
     * @return  
     */    
    public static String toJSON(Object jsonText) {    
        return JSON.toJSONString(jsonText,    
                SerializerFeature.WriteDateUseDateFormat);    
    }    
     
    /**  
     * 自定义时间格式  
     *   
     * @param jsonText  
     * @return  
     */    
    public static String toJSON(String dateFormat, String jsonText) {    
        mapping.put(Date.class, new SimpleDateFormatSerializer(dateFormat));    
        return JSON.toJSONString(jsonText, mapping);    
    }    
}

6. 获取逾期天数

// (版本一)获取逾期天数-精确到天
public int getOutOfDay(Date feeTime, Date now) {

	Calendar aCalendar = Calendar.getInstance();

	aCalendar.setTime(feeTime);

	int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);

	aCalendar.setTime(now);

	int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);

	return day2 - day1;
}

// (版本二)获取逾期天数-精确到秒,不足24小时,按0天计
public int getIntervalDays(Date feeTime, Date now) {

      if (null == feeTime || null == now) {

         return -1;

      }

      long intervalMilli = now.getTime() - feeTime.getTime();

      return (int) (intervalMilli / (24 * 60 * 60 * 1000));

}

7. 获取指定日期所在周的周一至周五的日期

public void getWeekByDate(Date time) {  
     // 设置时间格式	  
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
     Calendar cal = Calendar.getInstance();  
     cal.setTime(time);  
     // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了  
     int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
     if (1 == dayWeek) {  
         cal.add(Calendar.DAY_OF_MONTH, -1);  
     }  
     System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期  
     cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一  
     int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
     cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值  
     String day1 = sdf.format(cal.getTime());  
     System.out.println("所在周星期一的日期:" + day1);  
     cal.add(Calendar.DATE, 2);  
     String day3 = sdf.format(cal.getTime());  
     System.out.println("所在周星期三的日期:" + day3);  
     cal.add(Calendar.DATE, 2);  
     String day5 = sdf.format(cal.getTime());  
     System.out.println("所在周星期五的日期:" + day5);  
}

8. 获取两个日期中的每一天

public static void display(String dateFirst, String dateSecond){
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         
        try{
            Date dateOne = dateFormat.parse(dateFirst);
            Date dateTwo = dateFormat.parse(dateSecond);
            
            Calendar calendar = Calendar.getInstance();
             
            calendar.setTime(dateOne);
             
//          while(calendar.getTime().before(dateTwo)){   // 不包括最后期限              
            while(calendar.getTime().compareTo(dateTwo)<=0){  // 包括最后期限             
                System.out.println(dateFormat.format(calendar.getTime()));
                 
                calendar.add(Calendar.DAY_OF_MONTH, 1);               
            }
        }catch(Exception e){
            e.printStackTrace();
        }   
}

9. 获取所在周或月相关第一天及最后一天 的日期

public String[] getFirstAndLastDay(String flag) {
	String firstDay="";
	String lastDay="";
	String[]strs=new String[2];
	Calendar cal = Calendar.getInstance();
	//月相关
	if ("Month".equals(flag)) {
		cal.add(Calendar.MONTH, 0);
		cal.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
		firstDay = dateFormat.format(cal.getTime());
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		lastDay = dateFormat.format(cal.getTime());
	}
	//周相关
	if ("Week".equals(flag)) {
		cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		firstDay = dateFormat.format(cal.getTime());
		//cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);这个不符合中国人的时间观,老外把上周周日定为一周的开始。
		cal.set(Calendar.DATE, cal.get(Calendar.DATE) + 6);
		lastDay = dateFormat.format(cal.getTime());
	}
	strs[0]=firstDay;
	strs[1]=lastDay;
	return strs;  
}

10.特殊格式 2019-07-02T06:57:23.000+0000 转换成 2019-07-02 14:57:23  前端VUE:

renderTime:function(date) {
  	var dateee = new Date(date).toJSON();
  	return new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '') 
}

11. 获取指定日期之后的n天或小时

    /**
     * 取 后面 几天的 当前时间
     *
     * @param date
     * @param dayNum 天数
     * @return
     */
    public static Date getAfterDays(Date date, int dayNum) {
        if (date == null) return null;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int dayValue = calendar.get(Calendar.DAY_OF_MONTH);
        calendar.set(Calendar.DAY_OF_MONTH, dayValue + dayNum);
        return calendar.getTime();
    }

    /**
     * @param date 指定日期
     * @param hour 时间类型:小时
     * @description 获取*单位后的时间
     */
    public static Date getAfterHours(Date date, int hour) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR, hour); // 24小时制
        return cal.getTime();
    }

12.  返回开始周、月、年的第一天和结束周、月、年的最后一天

	/**
	 * @time 2022年3月17日 上午10:10:12
	 * @return Map<String,String>
	 * @param startTime:开始周 2022-12、endTime:结束周 2022-13
	 * @throw
	 * @tags 返回开始周的第一天(周日)和结束周的最后一天(周六)
	 */
	public static Map<String, String> doWeek(String startTime, String endTime) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(DAY_FORMAT);
		Map<String, String> map = new HashMap<>();
		// 时区
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
		// 2021年第15周,周日-周六为一周
		String[] starts = startTime.split("-");
		cal.set(Calendar.YEAR, Integer.parseInt(starts[0]));
		cal.set(Calendar.WEEK_OF_YEAR, Integer.parseInt(starts[1]));
		cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
		map.put("startTime", dateFormat.format(cal.getTime()) + " 00:00:00");
		// 2021年第15周,周日-周六为一周
		String[] ends = endTime.split("-");
		cal.set(Calendar.YEAR, Integer.parseInt(ends[0]));
		cal.set(Calendar.WEEK_OF_YEAR, Integer.parseInt(ends[1]));
		cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
		map.put("endTime", dateFormat.format(cal.getTime()) + " 23:59:59");
		cal.clear();
		return map;
	}

	/**
	 * @time 2022年3月17日 上午10:10:12
	 * @return Map<String,String>
	 * @param startTime:开始月 2022-02、endTime:结束月 2022-10
	 * @throw
	 * @tags 返回开始月的第一天和结束月的最后一天
	 */
	public static Map<String, String> doMonth(String startTime, String endTime) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(DAY_FORMAT);
		Map<String, String> map = new HashMap<>();
		// 时区
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));

		String[] starts = startTime.split("-");
		cal.set(Calendar.YEAR, Integer.parseInt(starts[0]));
		cal.set(Calendar.MONTH, Integer.parseInt(starts[1]) - 1);
		cal.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DATE));
		map.put("startTime", dateFormat.format(cal.getTime()) + " 00:00:00");

		String[] ends = endTime.split("-");
		cal.set(Calendar.YEAR, Integer.parseInt(ends[0]));
		cal.set(Calendar.MONTH, Integer.parseInt(ends[1]) - 1);
		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));
		map.put("endTime", dateFormat.format(cal.getTime()) + " 23:59:59");
		cal.clear();
		return map;
	}

	/**
	 * @time 2022年3月17日 上午10:10:12
	 * @return Map<String,String>
	 * @param startTime:开始年 2021、endTime:结束年 2022
	 * @throw
	 * @tags 返回开始年的第一天和结束年的最后一天
	 */
	public static Map<String, String> doYear(String startTime, String endTime) {
		Map<String, String> map = new HashMap<>();
		SimpleDateFormat dateFormat = new SimpleDateFormat(DAY_FORMAT);
		// 时区
		TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
		Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));

		cal.set(Calendar.YEAR, Integer.parseInt(startTime));
		cal.set(Calendar.DAY_OF_YEAR, cal.getActualMinimum(Calendar.DAY_OF_YEAR));
		map.put("startTime", dateFormat.format(cal.getTime()) + " 00:00:00");

		cal.set(Calendar.YEAR, Integer.parseInt(endTime));
		cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR));
		map.put("endTime", dateFormat.format(cal.getTime()) + " 23:59:59");
		cal.clear();
		return map;
	}

13. 根据指定日期(如:2022-03-16 10:36:18)获取所在年第几周

   /**
	 * @time 2022年3月17日 下午2:53:37
	 * @return String
	 * @throw
	 * @tags 根据指定日期(如:2022-03-16 10:36:18)获取所在年第几周
	 */
	public static String getWeekOfYear(String dateTime) {
		try {
			Calendar calendar = Calendar.getInstance();
			calendar.setFirstDayOfWeek(Calendar.SUNDAY);
			SimpleDateFormat format = new SimpleDateFormat(DAY_FORMAT);
			Date date = format.parse(dateTime);
			calendar.setTime(date);
			int week_of_year = calendar.get(Calendar.WEEK_OF_YEAR);
			int year = calendar.get(Calendar.YEAR);
			return year + "-" + week_of_year;
		} catch (ParseException e) {
			e.printStackTrace();
			return "";
		}
	}

14. 获取指定时间的24小时前的时刻

   /**
	 * @time 2022年4月27日 上午9:46:53
	 * @return String
	 * @throw
	 * @tags 获取指定时间的24小时前的时刻
	 */
	public static String get24hBefore(Date endDate) {
		if (endDate == null)
			endDate = new Date();
		Calendar date = Calendar.getInstance();
		date.setTime(endDate);
		date.set(Calendar.DATE, date.get(Calendar.DATE) - 1);
		String startDate = format(date.getTime(), SECOND_FORMAT);
//		String endDate = dateFormat.format(endDate);
		System.out.println(startDate);
		return startDate;
	}

15. 判断两个日期是否是同一日期

    // 判断两个日期是否是同一日期
    public static boolean isSameDay(Date startDate, Date endDate) {
        boolean sameDay = false;
        if (startDate != null && endDate != null) {
            Calendar calendarStart = Calendar.getInstance();
            Calendar calendarEnd = Calendar.getInstance();
            calendarStart.setTime(startDate);
            calendarEnd.setTime(endDate);
            sameDay = calendarStart.get(Calendar.YEAR) == calendarEnd.get(Calendar.YEAR) &&
                    calendarStart.get(Calendar.MONTH) == calendarEnd.get(Calendar.MONTH) &&
                    calendarStart.get(Calendar.DAY_OF_MONTH) == calendarEnd.get(Calendar.DAY_OF_MONTH);
        }
        return sameDay;
    }

16.  1.8中的新增日期相关:LocalDate、LocalTime、LocalDateTime、Instant

(1)LocalDate、LocalTime、LocalDateTime

Java中1.8之前有Date类和Calendar类。其中Date类到了1.8中大部分的方法被弃用了。

说明这些方法都有很大的缺陷,而且Date类如果不格式化可读性十分差,所以就需要格式化,而格式化使用SimpleDateFormat来进行操作线程不安全。

而Calendar类是一个共享变量,而且线程不安全,当多个线程同时使用SimpleDateFormat调用format()方法时,多个线程会同时调用Calendar.setTime()方法,而导致的后果是时间值一直被修改从而返回的格式化的时间是错误的。

而且SimpleDateFormat方法中format()和parse()方法都是线程不安全的。

Java1.8之后出现了LocalDate、LocalTime、LocalDateTime这些类。而这些类使用final来修饰,

使得这些类是不可变的,一旦实例化后值就固定了,有点类似于String类,所以这些类都是线程安全的。

LocalDate针对于年月日,LocalTime针对于时分秒,LocalDateTime针对于年月日时分秒。

(2)Instant

时间线上的瞬时点。Instant表示的时间精度比较高,它可以获取当前时间的纳秒。

对于LocalDate、LocalTime、LocalDateTime、Instant类进行格式化使用DateTimeFormatter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值