JAVA基础学习-第十讲 日期学习总结

197 阅读6分钟

JAVA基础教程

学习JAVA网站: how2j

第十讲_日期

10.1 Date对象

  • 时间原点的概念

所有的数据类型,无论是整数,布尔,浮点数还是字符串,最后都需要以数字的形式表现出来。

日期类型也不例外,换句话说,一个日期,比如2020年10月1日,在计算机里,会用一个数字来代替。

那么最特殊的一个数字,就是零. 零这个数字,就代表Java中的时间原点,其对应的日期是1970年1月1日 8点0分0秒 。 (为什么是8点,因为中国的太平洋时区是UTC-8,刚好和格林威治时间差8个小时)

为什么对应1970年呢? 因为1969年发布了第一个 UNIX 版本:AT&T,综合考虑,当时就把1970年当做了时间原点。

所有的日期,都是以为这个0点为基准,每过一毫秒,就+1。

  • 创建日期对象
public class date {
    public static void main(String[] args) {
        //当前时间
        Date d1 = new Date();
        System.out.println("当前时间:");
        System.out.println(d1);
        System.out.println();

        // 从1970年1月1日 早上8点0分0秒 开始经历的毫秒数
        Date d2 = new Date(5000);
        System.out.println("从1970年1月1日 早上8点0分0秒 开始经历了5秒的时间");
        System.out.println(d2);
    }
}

image.png

  • getTime获得时间

getTime() 得到一个long型的整数 这个整数代表 从1970.1.1 08:00:00:000 开始 每经历一毫秒,增加1。 直接打印对象,会看到 “Tue Jan 05 09:51:48 CST 2016” 这样的格式,可读性比较差,为了获得“2016/1/5 09:51:48”这样的格式 请参考日期格式化内容。

public static void main(String[] args) {
        //注意:是java.util.Date;
        //而非 java.sql.Date,此类是给数据库访问的时候使用的
        Date now= new Date();
        //打印当前时间
        System.out.println("当前时间:"+now.toString());
        //getTime() 得到一个long型的整数
        //这个整数代表 1970.1.1 08:00:00:000,每经历一毫秒,增加1
        System.out.println("当前时间getTime()返回的值是:"+now.getTime());
          
        Date zero = new Date(0);
        System.out.println("用0作为构造方法,得到的日期是:"+zero);
          
    }

image.png

  • System.currentTimeMillis()获取时间

当前日期的毫秒数: new Date().getTime() 和 System.currentTimeMillis() 是一样的。 不过由于机器性能的原因,可能会相差几十毫秒,毕竟每执行一行代码,都是需要时间的。

ublic static void main(String[] args) {
        Date now= new Date();
  
        //当前日期的毫秒数
        System.out.println("Date.getTime() \t\t\t返回值: "+now.getTime());
    
        //通过System.currentTimeMillis()获取当前日期的毫秒数
        System.out.println("System.currentTimeMillis() \t返回值: "+System.currentTimeMillis());     
    }

image.png

  • 练习-日期

借助随机数,创建一个从1995.1.1 00:00:00 到 1995.12.31 23:59:59 之间的随机日期

public class date {
    public static void main(String[] args) {
        //计算一天最多多少毫秒
        long HourValue = 1000*60*60;
        long DayValue = HourValue*24;
        long YearValue = 365*DayValue;
        long year95Start = (1995-1970)*YearValue;

        long leapday = (1995-1970)/4*DayValue;
        year95Start += leapday;//闰年

        year95Start -= 8*HourValue;//八个小时时差

        Date d1 = new Date(year95Start);
        System.out.println("1995年的第一天:"+d1);
        long year95Last = year95Start + YearValue - 1;
        Date d2 = new Date(year95Last);
        System.out.println("1995年的最后一天:"+d2);
        long randomTime = (long)(Math.random()*(YearValue-1)+year95Start);
        Date d3 = new Date(randomTime);
        System.out.println("1995年这一年中的一个随机时间:"+d3);
    }
}

image.png

更好的写法:

package Java基础.日期;
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class 日期类 {
    public static void main(String[] args) throws ParseException {
        String startStr = "1995.1.1 00:00:00";
        String endStr = "1995.12.31 23:59:59";
 
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
 
        Date start = sdf.parse(startStr);
        Date end = sdf.parse(endStr);
        long random = (long) (Math.random()*(end.getTime()-start.getTime())+start.getTime());
        System.out.println(new Date(random));
    }
}

10.2 日期格式化

SimpleDateFormat 日期格式化类

  • 日期转字符串

y 代表年;M 代表月;d 代表日; H 代表24进制的小时;h 代表12进制的小时; m 代表分钟;s 代表秒;S 代表毫秒。

public class date {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        Date d = new Date();
        String str = sdf.format(d);
        System.out.println("当前时间通过 yyyy-MM-dd HH:mm:ss SSS 格式化后的输出: "+str);

        SimpleDateFormat sdf1 =new SimpleDateFormat("yyyy-MM-dd" );
        Date d1= new Date();
        String str1 = sdf1.format(d1);
        System.out.println("当前时间通过 yyyy-MM-dd 格式化后的输出: "+str1);
    }
}

image.png

  • 字符串转日期

模式(yyyy/MM/dd HH:mm:ss)需要和字符串格式保持一致,如果不一样就会抛出解析异常ParseException

关于异常的详细讲解在Java 异常 Exception 章节展开

public class date {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        String str = "2016/1/5 12:12:12";
        String str2 = "2016-1-5 12:12:12";

        try{
            Date d = sdf.parse(str);
            System.out.printf("字符串 %s 通过格式  yyyy/MM/dd HH:mm:ss %n转换为日期对象: %s",str,d.toString());
        }catch (ParseException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println();
        try{
            Date d = sdf.parse(str2);
            System.out.printf("字符串 %s 通过格式  yyyy/MM/dd HH:mm:ss %n转换为日期对象: %s",str,d.toString());
        }catch (ParseException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

image.png

  • 练习-日期格式化

准备一个长度是9的日期数组,使用1970年-2000年之间的随机日期初始化该数组。 按照这些日期的时间进行升序排序。 比如 1988-1-21 12:33:22 就会排在 1978-4-21 19:07:23 前面,因为它的时间更小,虽然日期更大

public class RandomDate {
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
    private static Date[] mydates = new Date[9];

    private static String format(Date time) {
        return sdf.format(time);
    }

    private static void Show(Date[] mydates){
        for (int i = 0;i < mydates.length;i++){
            System.out.print(format(mydates[i]) + "\t\t");
            if((i+1) % 3 == 0)
                System.out.println();
        }
    }

    private static Date[] sortdate(Date[] mydates){
        Date[] newdates = mydates;
        for (int i = 0;i < newdates.length;i++){
            for (int j = i+1;j < newdates.length;j++){
                if(newdates[i].getTime() > newdates[j].getTime()){
                    long temp = newdates[j].getTime();
                    newdates[j].setTime(newdates[i].getTime());
                    newdates[i].setTime(temp);
                }
            }
        }
        return newdates;
    }

    public static void main(String[] args) {
        String startday = "1970.1.1 00:00:00";
        String endday = "2000.1.1 00:00:00";

        try {
            Date start = sdf.parse(startday);
            Date end = sdf.parse(endday);
            for (int i = 0;i < 9;i++){
                long Random = (long)(Math.random()*(end.getTime()-start.getTime())+start.getTime());
                mydates[i] = new Date(Random);
            }
        }catch (ParseException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Show(mydates);
        System.out.println();
        Date[] sorteddates = sortdate(mydates);
        Show(sorteddates);
    }
}

image.png

10.3 日期Calendar

Calendar类即日历类,常用于进行“翻日历”,比如下个月的今天是多久

  • Calendar与Date进行转换

采用单例模式获取日历对象Calendar.getInstance();

public class date {
    public static void main(String[] args) {
        //采用单例模式获取日历对象Calendar.getInstance();
        Calendar c = Calendar.getInstance();

        //通过日历对象得到日期对象
        Date d = c.getTime();

        Date d2 = new Date(0);
        c.setTime(d2); //把这个日历,调成日期 : 1970.1.1 08:00:00
    }
}
  • 翻日历

1)add方法,在原日期上增加年/月/日 2)set方法,直接设置年/月/日

public class TestDate {
 
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    private static String format(Date time) {
        return sdf.format(time);
    }
 
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        Date now = c.getTime();
        // 当前日期
        System.out.println("当前日期:\t" + format(c.getTime()));
 
        // 下个月的今天
        c.setTime(now);
        c.add(Calendar.MONTH, 1);
        System.out.println("下个月的今天:\t" +format(c.getTime()));
 
        // 去年的今天
        c.setTime(now);
        c.add(Calendar.YEAR, -1);
        System.out.println("去年的今天:\t" +format(c.getTime()));
 
        // 上个月的第三天
        c.setTime(now);
        c.add(Calendar.MONTH, -1);
        c.set(Calendar.DATE, 3);
        System.out.println("上个月的第三天:\t" +format(c.getTime()));
 
    }
}

image.png

  • 练习-Calendar

找出下个月的倒数第3天是哪天

public class date {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();

        System.out.printf("今天是:%s\n",c.getTime());

        c.add(Calendar.MONTH,2);
        c.set(Calendar.DAY_OF_MONTH,1);
        c.add(Calendar.DAY_OF_MONTH,-3);

        System.out.printf("下月倒数第三天是:%s",c.getTime());
    }
}

image.png