zoukankan      html  css  js  c++  java
  • Java基础之:日期类

    Java基础之:日期类

    第一代日期类

    1. Date:精确到毫秒,代表特定的瞬间

    2. SimpleDateFormat:格式和解析日期的类

    3. SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化.

    package class_Date;
    import java.util.Date;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    ​
    public class ClassTest_FirstDate {
    ​
        public static void main(String[] args) throws ParseException {
    ​
            Date d1 = new Date(); //获取当前系统时间
            Date d2 = new Date(9234567); //通过指定毫秒数得到时间
            System.out.println(d1.getTime()); //获取某个时间对应的毫秒数
    ​
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
            String format = sdf.format(d1); // format:将日期转换成指定格式的字符串
    ​
            String s = "1996年01月01日 10:20:30 星期一";
            Date parse = sdf.parse(s);  //parse方法会抛编译异常
    ​
        }
    }

    日期格式化输出的时候,使用的字母是提前规定好了的。

     

    第二代日期类

    第二代日期类,主要就是 Calendar类(日历)。

    public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<Calendar>

    Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

    package class_Date;
    import java.util.Calendar;
    public class ClassTest_SecondDate {
        public static void main(String[] args) {
            
            Calendar c = Calendar.getInstance(); // 创建日历类对象//比较简单,自由
            //抽象类创建对象,但实际c的运行类型为其子类 GregorianCalendar
            
            System.out.println(c);
            System.out.println(c.getClass());   //GregorianCalendar
            
            //获取日历对象的某个日历字段
            System.out.println("年:" + c.get(Calendar.YEAR));
            System.out.println("月:" + (c.get(Calendar.MONTH) + 1));
            System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));
            System.out.println("小时:" + c.get(Calendar.HOUR));
            System.out.println("分钟:" + c.get(Calendar.MINUTE));
            System.out.println("秒:" + c.get(Calendar.SECOND));
            
            // Calender 没有专门的格式化方法,所以需要程序员自己来组合显示
            System.out.println(
                    c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) 
                    + "月" + c.get(Calendar.DAY_OF_MONTH) + "日");
    ​
        }
    }
    

    第三代日期类

    前面两代日期类的不足分析:

    JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:

    1. 可变性:像日期和时间这样的类应该是不可变的。

    2. 偏移性:Date中的年份是从1900开始的,而月份都从0开始。

    3. 格式化:格式化只对Date有用,Calendar则不行。

    4. 此外,它们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s)。

    第三代日期类简单使用

    package class_Date;
    ​
    import java.util.Date;
    import java.time.Instant;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    ​
    public class ClassTest_ThirdDate {
    ​
        public static void main(String[] args) {
            // 第三代日期的基本使用
            LocalDateTime ldt = LocalDateTime.now(); // 日期时间对象
    //      LocalDate ldt = LocalDate.now();//LocalTime.now()
    //      System.out.println(ldt);
    ​
    //      LocalTime ldt = LocalTime.now();
    //      System.out.println(ldt);
            System.out.println(ldt.getYear());
            System.out.println(ldt.getMonthValue());
            System.out.println(ldt.getMonth());
            System.out.println(ldt.getDayOfMonth());
    ​
            System.out.println(ldt.getHour());
            System.out.println(ldt.getMinute());
            System.out.println(ldt.getSecond());
    ​
            // 格式化
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH小时mm分钟ss秒");
    ​
            String myDate = dtf.format(ldt);
            System.out.println(myDate);
    ​
            // Instant 和 Date
            System.out.println("=========Instant 和 Date 相互转换============");
            Instant now = Instant.now();
            System.out.println(now);
            Date date = Date.from(now);
            Instant instant = date.toInstant();
    ​
        }
    ​
    }

     

    第三代日期类常见方法

    1. LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间)

      • 类似于Calendar

      • LocalDate只包含日期,可以获取日期字段

      • LocalTime只包含时间,可以获取时间字段

      • LocalDateTime包含日期+时间,可以获取日期和时间字段

    2. Instant

      • 类似于Date

      • 提供了一系列和Date类转换的方式

      • Instant——>Date:

      • Date date = Date.from(instant);

      • Date——>Instant:

      • Instant instant = date.toInstant();

    3. DateTimeFormatter格式日期类

      • 类似于SimpleDateFormat

      • DateTimeFormat dtf = DateTimeFormatter.ofPattern(格式);

      • String str = dtf.format(日期对象);

    4. 第三代日期类更多方法

      • LocalDateTime类

      • MonthDay类:检查重复事件

      • 是否是闰年

      • 增加日期的某个部分

      • 使用plus方法测试增加时间的某个部分

      • 使用minus方法测试查看一年前和一年后的日期

      • 测试时间戳类:Instant ,相当于以前的Date

      • 测试DateTimeFormatter

    package class_Date;
    
    import java.time.Instant;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.MonthDay;
    import java.time.format.DateTimeFormatter;
    import java.time.temporal.ChronoUnit;
    import java.util.Date;
    
    import org.junit.Test;
    
    public class ClassTest_AllDateMethods {
    
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		// new AllDateMethods().hi();
    		// new AllDateMethods().hello();
    	}
    
    	// JUnit 测试单元
    	// 1. 配置快捷键 alt + J
    	// 2. 如果要运行某个 测试单元,就选中方法名或光标定位在方法名,在运行 Junit
    	// 3. 如果不选,就运行,就把所有的测试单元都运行
    	// 4.@Test,代表此方法是测试单元,可以单独运行测试
    	@Test
    	public void hi() {
    		System.out.println("hi ");
    	}
    
    	@Test
    	public void hello() {
    		System.out.println("hello");
    	}
    
    	@Test
    	public void testLocalDate() {
    		// 获取当前日期(只包含日期,不包含时间)
    		LocalDate date = LocalDate.now();
    		System.out.println(date);
    
    		// 获取日期的指定部分
    		System.out.println("year:" + date.getYear());
    		System.out.println("month:" + date.getMonth());
    		System.out.println("day:" + date.getDayOfMonth());
    		System.out.println("week:" + date.getDayOfWeek());
    
    		// 根据指定的日期参数,创建LocalDate对象
    		LocalDate of = LocalDate.of(2010, 3, 2);
    		System.out.println(of);
    
    	}
    
    	// 测试LocalTime类
    	@Test
    	public void testLocalTime() {
    		// 获取当前时间(只包含时间,不包含日期)
    		LocalTime time = LocalTime.now();
    		System.out.println(time);
    
    		// 获取时间的指定部分
    		System.out.println("hour:" + time.getHour());
    		System.out.println("minute:" + time.getMinute());
    
    		System.out.println("second:" + time.getSecond());
    		System.out.println("nano:" + time.getNano());
    
    		// 根据指定的时间参数,创建LocalTime对象
    		LocalTime of = LocalTime.of(10, 20, 55);
    		System.out.println(of);
    
    	}
    
    	// 测试LocalDateTime类
    
    	@Test
    	public void testLocalDateTime() { // 获取当前时间(包含时间+日期)
    
    		LocalDateTime time = LocalDateTime.now();
    
    		// 获取时间的指定部分 System.out.println("year:" + time.getYear());
    		System.out.println("month:" + time.getMonthValue());
    		System.out.println("day:" + time.getMonth());
    		System.out.println("day:" + time.getDayOfMonth());
    		System.out.println("hour:" + time.getHour());
    		System.out.println("minute:" + time.getMinute());
    
    		System.out.println("second:" + time.getSecond());
    		System.out.println("nano:" + time.getNano());
    
    		// 根据指定的时间参数,创建LocalTime对象
    		LocalDateTime of = LocalDateTime.of(2020, 2, 2, 10, 20, 55);
    		System.out.println(of);
    
    	}
    
    	@Test
    	public void testMonthDay() {
    
    		LocalDate birth = LocalDate.of(1994, 7, 14); // 生日
    		MonthDay birthMonthDay = MonthDay.of(birth.getMonthValue(), birth.getDayOfMonth());
    
    		LocalDate now = LocalDate.now(); // 当前日期
    		MonthDay current = MonthDay.from(now);
    
    		if (birthMonthDay.equals(current)) {
    			System.out.println("今天生日");
    		} else {
    			System.out.println("今天不生日");
    		}
    
    	}
    
    	// 判断是否为闰年
    	@Test
    	public void testIsLeapYear() {
    
    		LocalDate now = LocalDate.now();
    
    		System.out.println(now.isLeapYear());
    
    	}
    	// 测试增加日期的某个部分
    
    	@Test
    	public void testPlusDate() {
    
    		LocalDate now = LocalDate.now(); // 日期
    		// 3年前 的日期
    		LocalDate plusYears = now.plusDays(-1);
    		System.out.println(plusYears);
    
    	}
    
    	// 使用plus方法测试增加时间的某个部分
    	// 时间范围判断
    	@Test
    	public void testPlusTime() {
    
    		LocalTime now = LocalTime.now();// 时间
    
    		LocalTime plusHours = now.plusSeconds(-500);
    
    		System.out.println(plusHours);
    
    	}
    
    	// 使用minus方法测试查看一年前和一年后的日期
    
    	@Test
    	public void testMinusTime() {
    		LocalDate now = LocalDate.now();
    
    		LocalDate minus = now.minus(1, ChronoUnit.YEARS);
    
    		// LocalDate minus2 = now.minusYears(1);
    		System.out.println(minus);
    
    	}
    
    	// 测试时间戳类:Instant ,相当于以前的Date类
    	@Test
    	public void testInstant() {
    		Instant now = Instant.now();
    		System.out.println(now);
    
    		// 与Date类的转换
    		Date date = Date.from(now);
    		System.out.println(date);
    
    		Instant instant = date.toInstant();
    
    		System.out.println(instant);
    	}
    
    	// 格式转换
    	@Test
    	public void testDateTimeFormatter() {
    		DateTimeFormatter pattern = DateTimeFormatter.ofPattern("MM-dd yyyy HH:mm:ss");
    
    		// 将字符串转换成日期
    		LocalDateTime parse = LocalDateTime.parse("03-03 2017 08:40:50", pattern);
    		System.out.println(parse);
    
    		// 将日期转换成字符串
    		//LocalDateTime parse = LocalDateTime.now();
    		
    		String format = pattern.format(parse);
    		System.out.println(format);
    	}
    }
    

      


     

  • 相关阅读:
    java序列化与反序列化
    HTTP状态码
    基本运算符
    2019.9.10附加题while练习
    2019.9.11作业
    字符串
    列表list
    2019.9.10作业
    数字类型
    数据类型
  • 原文地址:https://www.cnblogs.com/SongHai/p/14175052.html
Copyright © 2011-2022 走看看