Date类
包 java.util.Date
构造方法:
public Date():创建一个对象,并且内置了当前时刻,精确到毫秒时刻。
public Date(long time):根据指定的毫秒数来创建一个对象。
Date当中的时间是从操作系统里面获取的(也就是说如果操作系统时间是错的,获得的时间也是错的)。
毫秒时刻是指:从公元1970年1月1日0点0分0秒0毫秒一直到程序现在运行的时刻,过去的时间有多少毫秒。
public class Demo01Date {
public static void main(String[] args) {
Date date1 = new Date();
System.out.println(date1); // 显示当前时间
Date date2 = new Date(0L);
System.out.println(date2); // 显示的是格林尼治时间,早上8点
long day = 1000 * 60 * 60 * 24; //一天的时间
Date date3 = new Date(day);
System.out.println(date3); // 显示的是格林尼治时间+1天
}
}
运行结果:
Sun Nov 19 15:26:00 CST 2017
Thu Jan 01 08:00:00 CST 1970
Fri Jan 02 08:00:00 CST 1970
CST 代表中国标准时间
System.out.println(date1);
调用了toString方法,实际数据是有精确到毫秒的,只是重写的toString方法不显示。
Date类常用方法
public long getTime():获取毫秒时刻
public void setTime(long time):设置毫秒时刻
public class Demo02DateMethod {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
long time = date.getTime();
System.out.println(time); // 当前时间的毫秒值
long delta = 2 * 60 * 60 * 1000;
time += delta;
date.setTime(time);
System.out.println(date); // 2个小时后
}
}
运行结果:
Sun Nov 19 15:39:50 CST 2017
1511077190578
Sun Nov 19 17:39:50 CST 2017
DateFormat
如果希望将一个日期(java.util.Date)转换成为一个好看的字符串,那么需要使用抽象类:java.text.DateFormat。
这个抽象类不能直接new对象,要想使用,必须使用子类。例如:java.text.SimpleDateFormat。
构造方法:
public SimpleDateFormat(String pattern):参数字符串是一个“模式”,也就是按照什么样的格式进行使用。
SimpleDateFormat抽象父类当中的方法:format和parse
如,对于格式:2017年11月19日09点18分05秒
对应模式:yyyy年MM月dd日HH点mm分ss秒
常用方法:
public String format(Date date):将一个日期对象转换成为指定格式的字符串。
public class Demo01SimpleDateFormat {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH点mm分ss秒");
String str = sdf.format(date);
System.out.println(str);
}
}
运行结果:
Sun Nov 19 15:47:38 CST 2017
2017年11月19日15点47分38秒
public Date parse(String str):将一个字符串按照指定的格式变成日期对象。
注意:模式必须和需要转换的字符串格式能对上。
public class Demo02Parse {
public static void main(String[] args) throws ParseException {
String str = "2015-11-19 09:25:30";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
}
}
运行结果:
Thu Nov 19 09:25:30 CST 2015
Calendar
Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。
java.util.Calendar日历类。这是一个抽象类,不能直接使用,需要使用子类:GregorianCalendar。
强烈推荐这个子类不要自己来new,而是通过静态方法获取Calendar:
public static Calendar getInstantce():获取一个Calendar的子类实例,默认就是GregorianCalendar。
Calendar cal = Calendar.getInstance();
public class Demo01CalendarInit {
public static void main(String[] args) {
// 不要自己new,太费劲,需要使用getInstance获取一个对象即可。
Calendar cal = Calendar.getInstance();
System.out.println(cal);
}
}
运行结果:
java.util.GregorianCalendar[time=1511078194908,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=2017,MONTH=10,WEEK_OF_YEAR=47,WEEK_OF_MONTH=4,DAY_OF_MONTH=19,DAY_OF_YEAR=323,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=56,SECOND=34,MILLISECOND=908,ZONE_OFFSET=28800000,DST_OFFSET=0]
如果希望从Calendar当中拿出来具体的信息,需要使用一个方法:
public int get(int field)
参数field:代表希望拿哪种数据出来?例如:年,还是月,还是日?
返回值:具体的数据值。
public class Demo02CalendarGet {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
System.out.println("年:" + year);
int month = cal.get(Calendar.MONTH) + 1; // 获取的月份从0开始
System.out.println("月:" + month);
int day = cal.get(Calendar.DAY_OF_MONTH);
System.out.println("日:" + day);
}
}
运行结果:
年:2017
月:11
日:19
如果希望设置Calendar当中的数据,需要调用:
public void set(int year, int month, int day):同时设置年月日
public void set(int field, int value):设置指定的单项数据
public class Demo03CalendarSet {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
printCalendar(cal);
cal.set(2012, 11, 21); // 月份从0开始,所以11就代表12Dec月份,在自定义输出时加1
printCalendar(cal);
cal.set(Calendar.DAY_OF_MONTH, 25);
printCalendar(cal);
cal.set(2012, 12, 21); // 由于月份从0开始,所以自定义输出的是2013年1月21日
printCalendar(cal);
}
private static void printCalendar(Calendar cal) {
StringBuilder sb = new StringBuilder();
sb.append(cal.get(Calendar.YEAR)).append("年");
sb.append(cal.get(Calendar.MONTH) + 1).append("月");
sb.append(cal.get(Calendar.DAY_OF_MONTH)).append("日");
System.out.println(sb);
}
}
运行结果:
2017年11月19日
2012年12月21日
2012年12月25日
2013年1月21日
如果希望在Calendar当中添加(或者减少)时间,那么可以使用add方法:
public void add(int field, int amount)
public class Demo04CalendarAdd {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
printCalendar(cal); // 2017年11月19日
cal.add(Calendar.MONTH, 3); // 三个月之后
printCalendar(cal);
cal.add(Calendar.MONTH, -1);
printCalendar(cal);
}
private static void printCalendar(Calendar cal) {
StringBuilder sb = new StringBuilder();
sb.append(cal.get(Calendar.YEAR)).append("年");
sb.append(cal.get(Calendar.MONTH) + 1).append("月");
sb.append(cal.get(Calendar.DAY_OF_MONTH)).append("日");
System.out.println(sb);
}
}
运行结果:
2017年11月19日
2018年2月19日
2018年1月19日
如果希望将一个日历Calendar转换成为日期时间Date,那么需要使用方法:
public Date getTime()
PS:为了满足往数据库存的需要,通常还要把Calendar转成date。
public class Demo05CalendarGetTime {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
Date date = cal.getTime(); // 返回date类型
System.out.println(date);
}
}
运行结果:
Sun Nov 19 16:18:32 CST 2017
Calendar也能支持毫秒的操作。
public void setTimeInMillis(long time):设置毫秒时刻
public long getTimeInMillis():获取毫秒时刻
public class Demo06CalendarMillis {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
printCalendar(cal);
long time = cal.getTimeInMillis();
System.out.println(time);
cal.setTimeInMillis(0L);
printCalendar(cal);
}
private static void printCalendar(Calendar cal) {
StringBuilder sb = new StringBuilder();
sb.append(cal.get(Calendar.YEAR)).append("年");
sb.append(cal.get(Calendar.MONTH) + 1).append("月");
sb.append(cal.get(Calendar.DAY_OF_MONTH)).append("日");
System.out.println(sb);
}
}
运行结果:
2017年11月19日
1511078294174
1970年1月1日