本节重点思维导图

Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型 随笔 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型 随笔 第2张

 

 Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型 随笔 第3张

Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型 随笔 第4张

Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型 随笔 第5张

Date对象创建

两个构造函数:

  • Date() ----使用当前日期和时间来初始化对象
  •  Date(long millisec) -----接收一个参数,该参数是从1970年1月1日起的毫秒数

 

 Date对象创建以后,可以调用下面的方法

 

1 boolean after(Date date)
若当调用此方法的Date对象在指定日期之后返回true,否则返回false。
2 boolean before(Date date)
若当调用此方法的Date对象在指定日期之前返回true,否则返回false。
3 Object clone( )
返回此对象的副本。
4 int compareTo(Date date)
比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。
5 int compareTo(Object obj)
若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。
6 boolean equals(Object date)
当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。
7 long getTime( )
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
8 int hashCode( )
 返回此对象的哈希码值。
9 void setTime(long time)
 
用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。
10 String toString( )
把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

 使用 SimpleDateFormat 格式化日期

import  java.util.*;
import java.text.*;
 
public class DateDemo {
   public static void main(String args[]) {
 
      Date dNow = new Date( );
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); //详细格式说明见上方思维导图
 
      System.out.println("当前时间为: " + ft.format(dNow));
   }
}

结果:

当前时间为: 2019-05-16 12:03:16

日期和时间的格式化编码 【往下翻】

 

 使用printf格式化日期

Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型 随笔 第6张

import java.util.Date;
 
public class DateDemo {
 
  public static void main(String args[]) {
     // 初始化 Date 对象
     Date date = new Date();
 
     //c的使用  
    System.out.printf("全部日期和时间信息:%tc%n",date);          
    //f的使用  
    System.out.printf("年-月-日格式:%tF%n",date);  
    //d的使用  
    System.out.printf("月/日/年格式:%tD%n",date);  
    //r的使用  
    System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date);  
    //t的使用  
    System.out.printf("HH:MM:SS格式(24时制):%tT%n",date);  
    //R的使用  
    System.out.printf("HH:MM格式(24时制):%tR",date);  
  }
}

结果:

全部日期和时间信息:星期四 五月 16 12:06:35 CST 2019-月-日格式:2019-05-16/日/年格式:05/16/19
HH:MM:SS PM格式(12时制):12:06:35 下午
HH:MM:SS格式(24时制):12:06:35
HH:MM格式(24时制):12:06

 

如果需要重复提供日期,那么利用这种方式就有点复杂了。可以利用一个格式化字符串指出要被格式化的参数的索引

索引必须紧跟在%后面,而且必须以$结束

import java.util.Date;
public class DateDemo {
 
   public static void main(String args[]) {
       // 初始化 Date 对象
       Date date = new Date();
        
       // 使用toString()显示日期和时间
       System.out.printf("%1$s %2$tB %2$td, %2$tY", 
                         "Due date:", date);
   }
}

结果:

Due date: 五月 16, 2019

可以使用 < 标志。它表明先前被格式化的参数要被再次使用

import java.util.Date;
  
public class DateDemo {
 
   public static void main(String args[]) {
       // 初始化 Date 对象
       Date date = new Date();
        
       // 显示格式化时间
       System.out.printf("%s %tB %<te, %<tY", 
                         "Due date:", date);
   }
}

结果:

Due date: 五月 16, 2019

 定义日期格式的转换符可以使日期通过指定的转换符生成新字符串

 

import java.util.*;
  
public class DateDemo {
   public static void main(String args[]) {
       Date date=new Date();                                      
        //b的使用,月份简称  
        String str=String.format(Locale.US,"英文月份简称:%tb",date);       
        System.out.println(str);                                                                              
        System.out.printf("本地月份简称:%tb%n",date);  
        //B的使用,月份全称  
        str=String.format(Locale.US,"英文月份全称:%tB",date);  
        System.out.println(str);  
        System.out.printf("本地月份全称:%tB%n",date);  
        //a的使用,星期简称  
        str=String.format(Locale.US,"英文星期的简称:%ta",date);  
        System.out.println(str);  
        //A的使用,星期全称  
        System.out.printf("本地星期的简称:%tA%n",date);  
        //C的使用,年前两位  
        System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date);  
        //y的使用,年后两位  
        System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date);  
        //j的使用,一年的天数  
        System.out.printf("一年中的天数(即年的第几天):%tj%n",date);  
        //m的使用,月份  
        System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date);  
        //d的使用,日(二位,不够补零)  
        System.out.printf("两位数字的日(不足两位前面补0):%td%n",date);  
        //e的使用,日(一位不补零)  
        System.out.printf("月份的日(前面不补0):%te",date);  
   }
}

结果:

英文月份简称:May
本地月份简称:五月
英文月份全称:May
本地月份全称:五月
英文星期的简称:Thu
本地星期的简称:星期四
年的前两位数字(不足两位前面补0):20
年的后两位数字(不足两位前面补0):19
一年中的天数(即年的第几天):136
两位数字的月份(不足两位前面补0):05
两位数字的日(不足两位前面补0):16
月份的日(前面不补0):16

 

解析字符串为时间

SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串

 

import java.util.*;
import java.text.*;
  
public class DateDemo {
 
   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 
 
      String input = args.length == 0 ? "1818-11-11" : args[0]; 
 
      System.out.print(input + " Parses as "); 
 
      Date t; 
 
      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println("Unparseable using " + ft); 
      }
   }
}

结果:

1818-11-11 Parses as Wed Nov 11 00:00:00 CST 1818

 

 

 Calendar类

  • 设置和获取日期数据的特定部分【比如小时,日,或者分钟】
  • 在日期的这些部分加上或者减去值

 一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可

 Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型 随笔 第7张

Java ——日期时间 日期时间相关类 随机数 定义类属性时建议使用引用数据类型 随笔 第8张

Calendar类 对象信息的设置

Set设置

如:

Calendar c1 = Calendar.getInstance();

调用:

public final void set(int year,int month,int date)
c1.set(2009, 6 - 1, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12

利用字段类型设置

如果只设定某个字段,例如日期的值,则可以使用如下set方法:

public void set(int field,int value)

把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算

c1.set(Calendar.DATE,10);

把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算

c1.set(Calendar.YEAR,2008);

其他字段属性set的意义以此类推

Add设置

Calendar c1 = Calendar.getInstance();

把c1对象的日期加上10,也就是c1也就表示为10天后的日期,其它所有的数值会被重新计算

c1.add(Calendar.DATE, 10);

把c1对象的日期减去10,也就是c1也就表示为10天前的日期,其它所有的数值会被重新计算

c1.add(Calendar.DATE, -10);

 其他字段属性的add的意义以此类推

 Calendar类对象信息的获得

Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

 

 

GregorianCalendar类

Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现

Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。

 

构造方法 & 方法 【页面最下方】

 

 

示例:求一段代码的执行时间

import java.util.Date;

public class Demo {

    public static void main(String[] args) {
        long start = new Date().getTime();
        
        fun();
        
        long end = new Date().getTime();
        System.out.println(end-start);
    }

    private static void fun() {
        for(int i =0;i<999;i++) {
            for(int j =0;j<999;j++) {
                System.out.println();
            }
        }
    }

}

 

 

 

示例:定义一个学生类,要求记录学生的学号、姓名、年龄、性别(用字符类型开示)、成绩、是否挂过科(用boolean)

定义类的属性时,要优先使用引用数据类型

public class Student {
    // 学号、姓名、年龄、生日 性别(用字符类型开示)、成绩、是否挂过科
    private String id;
    private String name;
    private Integer age;
    private Date birth;
    private Character gender;
    private Float score;
    private Boolean guaKe;

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String id, String name, Integer age, Date birth, Character gender, Float score, Boolean guaKe) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.birth = birth;
        this.gender = gender;
        this.score = score;
        this.guaKe = guaKe;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Character getGender() {
        return gender;
    }

    public void setGender(Character gender) {
        this.gender = gender;
    }

    public Float getScore() {
        return score;
    }

    public void setScore(Float score) {
        this.score = score;
    }

    public Boolean getGuaKe() {
        return guaKe;
    }

    public void setGuaKe(Boolean guaKe) {
        this.guaKe = guaKe;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + ", birth=" + birth + ", gender=" + gender
                + ", score=" + score + ", guaKe=" + guaKe + "]";
    }

}

 

SimpleDateFormat(要100%掌握)

日期格式化工具类

//   https://blog.csdn.net/gubaohua/article/details/575488/
public class Demo {

    public static void main(String[] args) throws ParseException {
        Date date = new Date();
        System.out.println(date);
        //1999年9月21日
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String format = sdf.format(date);
        System.out.println(format);
        
        String dateStr = "1999-9月21日";
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM月dd日");
        Date parse = sdf2.parse(dateStr);
        System.out.println(parse);
        
    }

}

LocalDate(要求掌握,一般要求)

参考页面:https://blog.csdn.net/tracycater/article/details/73017089

 

public class Demo {

    public static void main(String[] args) {
        // fun();

        /*
         * Date date = new Date(); LocalDate localDate = date2LocalDate(date);
         * System.out.println(date); System.out.println(localDate);
         */
        
        LocalDate localDate = LocalDate.now();
        Date date = localDate2Date(localDate);
        System.out.println("LocalDate = " + localDate);
        System.out.println("Date = " + date);
        
        Date localDate2Date = localDate2Date(LocalDate.parse("1999-09-21"));
        System.out.println(localDate2Date);
        
    }
    /**
     * 将LocalDate转换成Date
     * @param localDate
     * @return
     */
    public static Date localDate2Date(LocalDate localDate) {
        ZoneId zoneId = ZoneId.systemDefault();
        
        ZonedDateTime zdt = localDate.atStartOfDay(zoneId);

        return Date.from(zdt.toInstant());
    }

    /**
     * 将Date转换成LocalDate
     * @param date
     * @return
     */
    public static LocalDate date2LocalDate(Date date) {
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();

        // atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();
        return localDate;
    }

    private static void fun() {
        LocalDate localDate = LocalDate.now();
        System.out.println("The local date is :: " + localDate);

        System.out.println("The number of days available for this month:: " + localDate.lengthOfMonth());
        // Know the month name
        System.out.println("What is the month name? :: " + localDate.getMonth().name());
        // add 2 days to the today's date.
        System.out.println(localDate.plus(2, ChronoUnit.DAYS));
        // substract 2 days from today
        System.out.println(localDate.minus(2, ChronoUnit.DAYS));

        LocalDate parse = LocalDate.parse("2018-09-21");
        System.out.println(parse);
        System.out.println(parse.getYear());
    }

}

 

 

Random

用来产生随机数

public static void main(String[] args) {
        Random random = new Random();
        int nextInt = random.nextInt();
        System.out.println(nextInt);
        int nextInt2 = random.nextInt(10); //[0,10)
        System.out.println(nextInt2);
    }

Math

包含和数学相关的东西,其内部所有的内容都是static的

产生一个[m,n)之间的随机数:

 

Math.random()*(n-m)+m    
  public static void main(String[] args) {
        System.out.println(Math.E);
        System.out.println(Math.sqrt(9));
        System.out.println(Math.ceil(3.2));
        System.out.println(Math.ceil(3.8));
        System.out.println(Math.ceil(-3.2));
        
        System.out.println(Math.floor(3.2));
        System.out.println(Math.floor(-3.2));
        
        System.out.println(Math.pow(3, 4));
        
        double random = Math.random();//[0,1)
        System.out.println(random);
        
        //1000~9999
        for(int i =1;i<=500;i++) {
            int d = (int) (Math.random()*8999+1000);
            System.out.print(d+" \t");
            if(i%10==0)
                System.out.println();
        }
        
        System.out.println(Math.abs(-8));
        System.out.println(Math.max(8, 10));
        System.out.println(Math.min(3, -5));
    }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄