目录
1>判断是否是闰年:能被4整除且不能被100整除,或能被400整除为闰年
3、DateFormat类和SimpleDateFormat类
1、Date类
JDK1.8 源码,Date 类定义了解一下:
public class Date implements java.io.Serializable, Cloneable, Comparable<Date>{
private static final long serialVersionUID = 7523967970034938905L;
private transient long fastTime;
private static final BaseCalendar gcal = CalendarSystem.getGregorianCalendar();
public Date() {
this(System.currentTimeMillis());
}
public Date(long date) {
fastTime = date;
}
}
创建一个时间对象有多个构造函数,目前 JDK1.8 仅推荐俩种:
Date date = new Date(); // 获得一个 System.currentTimeMillis() 值
Date date = new Date(long date);
// long date 该整数的值代表的是距离格林尼治标准时间(1970年1月1日0时0分0秒)的毫秒数,
就是说fastTime值为1000的时候代表时间为1970年1月1日0时0分1秒。
2、Calendar类
现在关于日期使用最多的也就是该类,Calendar 要比Date强大很多,而且不需要考虑时区转化问题。
JDK1.8 源码,Calendar 类定义了解一下:
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
public final static int ERA = 0;
public final static int YEAR = 1;
public final static int MONTH = 2;
public final static int WEEK_OF_YEAR = 3;
public final static int WEEK_OF_MONTH = 4;
public final static int DATE = 5;
public final static int DAY_OF_MONTH = 5;
public final static int DAY_OF_YEAR = 6;
public final static int DAY_OF_WEEK = 7;
public final static int DAY_OF_WEEK_IN_MONTH = 8;
public final static int AM_PM = 9;
public final static int HOUR = 10;
public final static int HOUR_OF_DAY = 11;
public final static int MINUTE = 12;
public final static int SECOND = 13;
public final static int MILLISECOND = 14;
public final static int ZONE_OFFSET = 15;
public final static int DST_OFFSET = 16;
public final static int FIELD_COUNT = 17;
public final static int SUNDAY = 1;
public final static int MONDAY = 2;
public final static int TUESDAY = 3;
...
public final static int JANUARY = 0;
public final static int FEBRUARY = 1;
public final static int AM = 0;
public final static int PM = 1;
public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}
public static Calendar getInstance(TimeZone zone)
{
return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
}
}
上边是源码中整理出来,可以看出 Calendar 类中有很多静态变量,这些常量将会作为索引用来检索 fields 属性,例如:fields[YEAR]将返回当前毫秒值对应的日期时间的年份部分,fields[MONTH]将返回的是月份部分的值等等。
随便调用我们的日期类,就可以看到其方法内部最后调用 internalGet 对 fields 值进行返回。
Calendar calendar = Calendar.getInstance(); calendar.set(year,month-1,day);
由源码常量定义可知:JANUARY = 0,FEBRUARY = 1...所以月份要 +1 才是当前月份;
上午=0,下午=1;
星期日=1,星期一=2,星期二=3,...
常用的一些方法:
1>判断是否是闰年:能被4整除且不能被100整除,或能被400整除为闰年
@Test
public void isNotLeapYear(){
int year = 2018;
GregorianCalendar calendar = new GregorianCalendar();
System.out.println("判断是否是闰年:"+calendar.isLeapYear(year));
}
2> 获得今年有多少天
@Test
public void yearAllDay(){
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2018);
System.out.println("今年有多少天:"+cal.getActualMaximum(Calendar.DAY_OF_YEAR));
}
3>判断今天是星期几
@Test
public void whatWeek(){
Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
System.out.println("今天是星期几:"+(c.get(Calendar.DAY_OF_WEEK)-1));//记得减一啊
}
4>获取当前 年/月/周/日
@Test
public void dateYearMonthDay(){
Calendar calendar = Calendar.getInstance();
Date date = new Date();
//以下四个方法将废弃,推荐下面的获取方式
//int year = date.getYear()+1900;
//int month = date.getMonth();
//int week = date.getDay();
//int day = date.getDate();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH)+1;
int week = calendar.get(Calendar.DAY_OF_WEEK)-1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("year:"+year+"month:"+month+"week:"+week+"day:"+day);
}
5>获取当月最大和最小的一天
@Test
public void dateMaxMinDay(){
Calendar calendar = Calendar.getInstance();
Date date = new Date();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(year, month, day);
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("Max Day: " + maxDay);
int minDay = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println("Min Day: " + minDay);
}
6>计算两个日期之间相差的天数
@Test
public void daysBetween() throws ParseException {
Date startdate = new Date();
Date enddate = new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
startdate=sdf.parse(sdf.format(startdate));
enddate=sdf.parse(sdf.format(enddate));
Calendar cal = Calendar.getInstance();
cal.setTime(startdate);
long time1 = cal.getTimeInMillis();
cal.setTime(enddate);
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
System.out.println("两个日期之间相差的天数:"+Integer.parseInt(String.valueOf(between_days)));
}
7>距离当天日期 100 天的日期
@Test
public void dateAdd() throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date parse = dateFormat.parse("20181126");
Calendar c =Calendar.getInstance();
c.setTime(parse);
c.add(Calendar.DATE, 100);//当前日期增加100天
//tempStart.add(Calendar.DAY_OF_YEAR, 1);//本年度的日数加一
String format = dateFormat.format(c.getTime());
System.out.println("距离当天日期 100 天的日期:"+format);
}
8>获取某一日期区间的日期
@Test
public void dateGap() throws ParseException {
// 返回的日期集合
List<String> days = new ArrayList<String>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = sdf.parse("2018-11-01");
Date end = sdf.parse("2018-11-23");
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
while (tempStart.before(tempEnd)) {
days.add(dateFormat.format(tempStart.getTime()));
tempStart.add(Calendar.DAY_OF_YEAR, 1);//本年度的日数加一
}
}
9>
10>
11>
3、DateFormat类和SimpleDateFormat类
JDK1.8 源码:DateFormat.class
public abstract class DateFormat extends Format {
private static final long serialVersionUID = 7218322306649953788L;
protected Calendar calendar;
protected NumberFormat numberFormat;
public static final int ERA_FIELD = 0;
...
}
JDK1.8 源码:SimpleDateFormat.class
public class SimpleDateFormat extends DateFormat {
static final long serialVersionUID = 4774881970558875024L;
static final int currentSerialVersion = 1;
private int serialVersionOnStream;
private String pattern;
...
}
这俩个类都是对日期时间进行格式化(如:可以将日期转换为指定格式的文本,也可以将文本转换为日期)
SimpleDateFormat 类是 DateFormat 类(抽象类)的子类 。可以实现自由定制格式类型。
创建 DateFormat 对象:
DateFormat df = DateFormat.getDateInstance() ;
df.format(DateFormat.YEAR_FIELD,new Locale("zh","CN")) ; // 格式化日期:Date -转- String 2018年11月26日
df.parse("2018-11-26") // 格式化日期:String -转- Date Mon Nov 26 00:00:00 CST 2018
创建 SimpleDateFormat 对象:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.format(new Date()) ; // 格式化日期:Date -转- String 2018-11-26
sdf.parse("2018-11-26") ; // 格式化日期:String -转- Date Mon Nov 26 00:00:00 CST 2018
4、日期类对象之间的互转
以下内容是整理别人的博客,忘记链接了,如有侵权请告知。
简单测试类如下:
@Test
public void dateTransfer() throws ParseException {
/************************** Date 与 Calendar 互相转换 begin ***************************************/
//1.Date 转化为Calendar
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
//2.Calenda转换为Date
Calendar calendar2 = Calendar.getInstance();
Date date =calendar2.getTime();
/*************************** Date 与 Calendar 互相转换 end **************************************/
/************************** String与 Date 互相转换 begin ***************************************/
//1.Date 转化String
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
String dateStr=sdf.format(new Date());
//2.String 转化Date
String str="2010-5-27";
Date date2 = sdf.parse(str);
/*************************** String与 Date 互相转换 end **************************************/
/************************** Calendar与 Date 互相转换 begin ***************************************/
//1 .将Calendar对象转换为Date(c.getTime())
Calendar c = Calendar.getInstance();
Date d = c.getTime();
// 2.将Date转换为Calendar对象(s.setTime(date))
Calendar c1 = Calendar.getInstance();
Date d1 = new Date();
c1.setTime(d1);
/*************************** Calendar与 Date 互相转换 end **************************************/
/************************** Calendar与Long互相转换 begin ***************************************/
// 将Calendar对象转换为相对时间
Calendar c2 = Calendar.getInstance();
long long1 = c2.getTimeInMillis();
System.out.println("将Calendar对象转换为相对时间:"+long1);//1543244109740L
// 将long转换为Calendar对象
Calendar cal = Calendar.getInstance();
long long2 = 1252785271098L;
cal.setTimeInMillis(long2);
System.out.println("将long转换为Calendar对象:"+long2);//1252785271098
/*************************** Calendar与Long互相转换 end **************************************/
/************************** Date与Long互相转换 begin ***************************************/
//1.将Date类的对象转换为long型时间
Date date3= new Date();
long longDate = date3.getTime();
System.out.println("将Date类的对象转换为long型时间:"+longDate);//:1543243849147L
//2.将long型时间转换为Date类的对象
long time = 1543243460536L;
Date dt = new Date(time);
System.out.println("使用Date的构造方法完成:"+dt);//Mon Nov 26 22:44:20 CST 2018
/*************************** Date与Long互相转换 end **************************************/
}