Date类
- Date表示特定的瞬间,精确到毫秒。
- 在jdk1.1之前,类Date有两个其他的函数。它允许把日期解释为年、月、日、小时、分、秒。它也允许格式化和解析日期字符串。不过,这些函数的API不易于实习那国际化。从jdk1.1开始,应使用Calendar类实现日期和时间字段之间的转换,使用DateFormat类类格式化和解析日期字符串。Date中相应的方法已废弃。
calendar类
- Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获取下星期的日期)提供了一些方法。
- 瞬间可以用毫秒值来表示,它是距历元(即格林威治标准时间:1970年1月1日的00:00:00.000)的偏移量。
简单说就是:java.util.Date是个日期数据;java.util.Calendar用于日期的相关计算;
java日期类:Date和Canlendar的使用
1.如何实例化当前时间
Date date = new Date();
Calendar calendar = Calendar.getInstance();
System.out.println(date.toString());
//输出:Thu Oct 18 13:46:43 CST 2018
System.out.println(calendar.toString());
//输出:java.util.GregorianCalendar[time=1539841603042,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=291,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=1,HOUR_OF_DAY=13,MINUTE=46,SECOND=43,MILLISECOND=42,ZONE_OFFSET=28800000,DST_OFFSET=0]
根据输出内容,可以看到Date和Calendar的区别
2.如何实例化特定时间
//注:mm:ss必须小写,否则无法转换。HH大小写无影响。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date1 = null;
try {
date1 = df.parse("2017-08-07 11:11:11");
} catch (ParseException e) {
e.printStackTrace();
}
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
实例化时注意:
- 建议从Date使用格式转换,然后赋值(setTime)给Calendar,不然直接设置Calendar用毫秒数太麻烦。
- 另外,实例化时的格式:yyyy-MM-dd hh:mm:ss 中mm:ss必须小写,否则无法转换,HH大小写无影响。
3.Date和Calendar如何互相转化
Date date1 = new Date();
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Date date = calendar1.getTime();
Calendar类有两个方法:setTime和getTime。
- setTime接受一个Date类型的参数;
- getTime返回一个Date类型的结果;
4.如何格式化时间
使用DateFormat进行时间的格式化,示例如下;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String s = df.format(new Date());
5.如何对日期进行操作。即日期加减:年月日以及时分秒等
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date1 = new Date();
//输出:2018-10-18 02:18:27
System.out.println(df.format(date1));
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
calendar1.add(Calendar.MONTH,1);
Date date = calendar1.getTime();
//输出:2018-11-18 02:18:27
System.out.println(df.format(date));
使用Calendar的add方法:下面是官方接口定义:
| abstract void | add(int field,int amount) 根据日历的规则,为给定的日历字段添加或者减去指定的时间量。 |
field表示时间量:可以为如下:
- Calendar.ERA:表示无加减
- Calendar.YEAR:年
- Calendar.MONTH:月
- Calendar.DATE:日
- Calendar.HOUR:小时
- Calendar.MINUTE:分钟
- Calendar.SECOND:秒
注意:Calendar中的所有常量都可以为参数,不一定局限于上面的。比如Calendar.HOUR_OF_DAY,Calendar.WEEK_OF_MONTH等,不管是什么,只要这个值和周相关就是周(月中的第几周,年中的第几周等),和日相关的就是日(一年当中的第几天,一月当中的第几天,一周当中的第几天)。
amount:amount为整数表示当前时间的基础上加上对应的时间量;为负数则表示当前时间减去对应的时间量。
6.其他常用方法
//获取当天结束时间:59分59秒0毫秒
private Date getDayEnd() {
Calendar cal = new GregorianCalendar();
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
7.日期工具类
package com.dmall.virtual.domain.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateUtils {
public static final String MMddHHmmss = "MM-dd HH:mm:ss";
public static final String yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss";
public static final String yyyy_MM_dd = "yyyy-MM-dd";
public static final String yyyyMMdd = "yyyy.MM.dd";
public static final String HHmm = "HH:mm";
public static final String MM_dd = "MM-dd";
public static final String yyyy_MM_dd_other = "yyyy-MM-dd";
private static final Logger logger = LoggerFactory.getLogger(DateUtils.class);
/**
* 根据基础时间(base),单位(unit),偏移量(differ)对时间进行偏移并返回偏移后的时间
* @param base
* @param forward
* @param unit
* @param differ
* @return
*/
public static Date shiftDate(Date base, boolean forward, DateUnit unit, int differ){
if(base == null){
return null;
}
if(differ <= 0){
return base;
}
Calendar c = Calendar.getInstance();
c.setTime(base);
c.set(unit.getUnit(), c.get(unit.getUnit()) +(forward ? differ : -differ));
return c.getTime();
}
public enum DateUnit{
YEAR(Calendar.YEAR),
MONTH(Calendar.MONTH),
WEEK(Calendar.MONTH),
DAY(Calendar.DAY_OF_YEAR),
HOUR(Calendar.HOUR_OF_DAY),
MINUE(Calendar.MINUTE),
SECOND(Calendar.SECOND);
private int unit;
private DateUnit(int unit){
this.unit = unit;
}
public int getUnit() {
return unit;
}
public void setUnit(int unit) {
this.unit = unit;
}
}
/**
* 日期格式化为字符串
* @param date
* @param format
* @return
*/
public static String formatDate(Date date, String format) {
if (date == null) {
return null;
}
try{
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}catch(Exception e){
logger.error("日期格式化失败,date={}", date,e);
return null;
}
}
/**
* 字符串格式化为日期
* @param dateStr
* @param format
* @return
*/
public static Date parseDate(String dateStr, String format){
DateFormat formatter = new SimpleDateFormat(format);
if(StringUtils.isBlank(dateStr)){
return null;
}
try {
return formatter.parse(dateStr.trim());
} catch (ParseException e) {
logger.warn("ParseException日期异常1,参数dateStr={},format={}",new Object[]{dateStr,format,e});
return null;
}catch (Exception e) {
logger.warn("ParseException日期异常2,参数dateStr={},format={}",new Object[]{dateStr,format,e});
return null;
}
}
/**
* 获取当天指定时间(时-分-秒)的日期
* @param hours
* @return
*/
public static Date getSpecialHms(Date date, int hours, int minutes, int seconds) {
if(date == null){
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);
cal.set(Calendar.SECOND, seconds);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
/**
* 获取指定日期的小时
* @return
*/
public static int getCurrentHours(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.HOUR_OF_DAY);
}
public static void main(String[] args) {
}
}
这篇博客详细介绍了Java中的Date和Calendar类,包括它们的用途、如何实例化当前和特定时间、两者间的转化方法、时间的格式化以及日期的操作(如加减)。重点讲解了Calendar的add方法用于日期加减,以及日期工具类的应用。
761

被折叠的 条评论
为什么被折叠?



