Java中日期和时间的常用方法

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日

你可能感兴趣的:(Java中日期和时间的常用方法)