2.javase常用类之时间相关

日期

1 日期类:java.util.Date

1.1Date概述

​ 很多方法都过时了,推荐使用日历类Calendar来进行代替。

1.2 简单使用

	public static void main(String[] args) {
		//1.1.空参构造器:默认获取当前时间
		Date date=new Date();
		System.out.println(date); //Thu Jun 18 17:19:44 CST 2020
		//1.2.根据传入毫秒值,创建date
		Date date1=new Date(0l);
		System.out.println(date1);  //Thu Jan 01 08:00:00 CST 1970
		//2.1将时间的年设置为指定年
		date1.setYear(date.getYear()-1);
		System.out.println(date1);  //Tue Jan 01 08:00:00 CST 2019
		//2.2毫秒值和date之间的转换
		System.out.println(date.getTime()); //1592473246614
		date.setTime(0);
		System.out.println(date);  //Thu Jan 01 08:00:00 CST 1970
		//2.3获取当前系统对应的字符串形式
		String localeString = date.toLocaleString();
		System.out.println(localeString);  //1970-1-1 8:00:00
		System.out.println(dateToStr(new Date())); //2020年6月18日   星期四	17时5分37秒
				
	}
	/**
	 * @Description :将时间转化为指定格式的字符串
	 * @author 龍
	 * date 2020年6月18日下午5:39:36
	 * @param date
	 * @return
	 */
	public static String dateToStr(Date date) {
		int year = date.getYear();
		int month =date.getMonth();
		int day=date.getDate();
		int week=date.getDay();
		int hour=date.getHours();
		int minute=date.getMinutes();
		int second=date.getSeconds();
		String weeks="一二三四五六日";
		return (1900+year)+"年"+(month+1)+"月"+day+"日"
				+"   星期"+weeks.charAt(week-1)+"\t"+hour+"时"+month+"分"+second+"秒";
	}

2 SimpleDateFormat

2.1 出现背景

​ Data类的API不易于国际化,该类是为了对日期Date类进行格式化和解析,位于java.text.SimpleDateFormat

星期
yMdEHms

2.2 简单使用

@Test
public void TestSimpleDateFormat() throws ParseException {
    //1.实例化SimpleDateFormat类对象
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
    //2.格式化:日期-->字符串
    //2.1创建Date对象
    Date date = new Date();
    System.out.println(date);
    //2.2对date进行格式化
    String format = simpleDateFormat.format(date);
    System.out.println(format);
    //3.解析-->通常我们不喜欢使用默认的格式进行解析,所以需要使用带参数SimpleDateFormat对象。
    SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
    String string="2019-08-09";
    //3.1将需要解析的字符串传入parse方法的参数中去
    //注意:解析的时候字符串格式要符合SimpleDateFormat的解析格式,否则会报异常
    //java.text.ParseException: Unparseable date: "2019-08-09"
    Date parse = simpleDateFormat1.parse(string);
    System.out.println(parse);
    System.out.println(simpleDateFormat1.parse(format));
    System.out.println(simpleDateFormat1.format(date));
}

2.3 常见场景

/**
 * 练习一:字符串“2020-8-9”转换为java.sql.Data
 */
@Test
public void test01() throws ParseException {
    String string="2020-8-9";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date parse = simpleDateFormat.parse(string);
    //数据库中date设置需要使用毫秒值来进行赋值
    java.sql.Date date=new java.sql.Date(parse.getTime());
    //2020-08-09
    System.out.println(date);
    //class java.sql.Date
    System.out.println(date.getClass());
}
/**
 * "三天打鱼,两天晒网"  1990-1-1开始  xxxx-xx-xx 打渔?or晒网?
 * 总天数计算,
 */
public static void main(String[] args) {
    try {
        new SimpleDateFormatTest().test02();
    } catch (ParseException e) {
        System.out.println(e.getMessage());
    }
}
//@Test
public void test02() throws ParseException {
    String startDate="1990-1-1";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date parse = simpleDateFormat.parse(startDate);
    long start=parse.getTime();
    Scanner scanner = new Scanner(System.in);
    while(true){
        System.out.println("请输入日期(xxxx-MM-dd):");
        String next = scanner.next();
        Date parse1 = simpleDateFormat.parse(next);
        long end=parse1.getTime();
        switch ((int)(((end-start)/1000/60/60/24)%5)){
            case 0:
            case 1:
            case 2:
                System.out.println("打渔!!!");
                break;
            default:
                System.out.println("晒网");
                break;
        }
    }

}

3 日历类:Calendar

3.1 简介

​ 所述Calendar类是一个抽象类,可以为在某一特定时刻和一组属性之间的转换的方法[calendar fields]如YEAR , MONTH ,DAY_OF_MONTH ,HOUR 等等,以及用于操纵该日历字段,如获取的日期下个星期。 时间上的瞬间可以用毫秒值表示,该值是从1970年1月1日00:00 00:00.000 GMT(Gregorian)的Epoch的偏移量

3.2 对象的创建

  • ​ 创建其子类(GregorianCalendar)对象。
  • ​ 调用其静态方法getInstance():实际返回的依旧是其子类对象

3.3 常用方法

  • **get(int field):**填入Calendar中的静态属性。可以获取一些常用的属性
  • **set(int field,int value):**修改当前Calendar对象的值。
  • **add():**增加指定值到当前属性。
  • **getTime():**日历类–>Date
  • **setTime(Date date):**Date–>日期类

3.4 简单使用

@Test
public void testCalendar(){
    //4.1实例化
    //方式一:创建其子类(GregorianCalendar)对象。
    //方式二:调用其静态方法getInstance()
    Calendar instance = Calendar.getInstance();
    //class java.util.GregorianCalendar。
    System.out.println(instance.getClass());
    //4.1方法的测试
    //get(int field):获取指定的参数值
    int i = instance.get(Calendar.DAY_OF_MONTH);
    System.out.println(i);
    //set(int field,value):设置参数为指定的值
    instance.set(Calendar.DAY_OF_MONTH,22);
    int i1 = instance.get(Calendar.DAY_OF_MONTH);
    System.out.println(i1);
    //add(int field,amount):
    instance.add(Calendar.DAY_OF_MONTH,3);
    int i2 = instance.get(Calendar.DAY_OF_MONTH);
    System.out.println(i2);
    //getTime():日历类-->Date
    Date time = instance.getTime();
    //Wed Mar 25 11:45:00 CST 2020
    System.out.println(time);
    //setTime(Date date):Date-->日期类
    Date date = new Date();
    instance.setTime(date);
    int i3 = instance.get(Calendar.DAY_OF_MONTH);
    System.out.println(i3);
    Date date1 = new Date(2020, 10, 1); //设置的时候是从1900年开始算起的
    //Mon Nov 01 00:00:00 CST 3920
    System.out.println(date1);
    //void setTimeInMillis(long millis) :设置日历对象为参数毫秒值对应的时间
	//void getTimeInMillis():获取日历对象对应的毫秒值
    
}
/**
public static void calendarTest1() {
		Calendar calendar=Calendar.getInstance();
		calendar.set(Calendar.YEAR, 2010);
		calendar.set(Calendar.MONTH, 0);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		Calendar now=Calendar.getInstance();
		Long time=now.getTimeInMillis()-calendar.getTimeInMillis();
		int date=(int)(time/1000/3600/24);
		System.out.println(date);
		switch (date%5) {
		case 0:
		case 1:
		case 2:
			System.out.println("打渔日!");
			break;
		default:
			System.out.println("晒网日");
			break;
		}
	}

4 日期时间:LocalDateTime

4.1 出现的背景

在开发过程中我们发现之前的日期类和日历类存在一些问题。

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

  • 偏移性:Date中的年份是从1900年开始的,月份是从0开始的。

    Date date1 = new Date(2020, 10, 1);

    System.out.println(date1); //Mon Nov 01 00:00:00 CST 3920

  • 格式化:格式化只对Date有用(SimpleDateFormat),Calendar则不行。

  • 也不是线程安全的,也不能处理闰秒等。

4.2 改进

 java8吸收了joda-Time的精华,新的java.time中包括所有关于本地日期(LocalDate),本地时间(LocalTime),本地日期时间(LocalDateTime),时区(ZonedDateTime)和持续时间(Duration)的类。Date类新增了toInstant( )用于将Date转换成新的表示形式。这些新增的本地化时间日期API大大的简化了日期时间和本地化的管理。

4.3 包结构

  • java.time-包含值对象的基础包。
  • java.time.chrono-提供对不同的日历系统的访问
  • java.time.format-格式化和解析时间和日期
  • java.time.temporal-包括底层框架和扩展性
  • java.time.zone-包括时区支持的类。

4.4 简单使用

@Test
public void testTime(){
    //now():静态方法,获取当前的日期,时间,日期+时间。
    LocalDate now = LocalDate.now();
    LocalTime now1 = LocalTime.now();
    LocalDateTime now2 = LocalDateTime.now();
    //2020-03-15
    System.out.println(now);
    //12:54:58.043
    System.out.println(now1);
    //2020-03-15T12:54:58.043
    System.out.println(now2);
    //of():设置指定的年月日时分秒,
    LocalDateTime of = LocalDateTime.of(2020, 10, 1, 8, 10, 4);
    //2020-10-01T08:10:04(无偏移量)
    System.out.println(of);
    //getXxx():获取指定的属性
    //15
    System.out.println(now2.getDayOfMonth());
    //SUNDAY
    System.out.println(now2.getDayOfWeek());
    //MARCH
    System.out.println(now2.getMonth());
    //75
    System.out.println(now2.getDayOfYear());
    //withXxx():设置相关的属性。体现了不可变性,返回值是修改之后的对象,本来的对象不会发生改变。比起Calendar更加的靠谱。
    LocalDateTime localDateTime = now2.withDayOfMonth(21);
    //2020-03-21T13:08:09.420
    System.out.println(localDateTime);
    //2020-03-15T13:08:09.420
    System.out.println(now2);
    //plusXxx():给指定属性增加。仍然是不可变性,本身对象属性不发生变化
    LocalDateTime localDateTime1 = localDateTime.plusMonths(3);
    //2020-03-21T13:08:09.420
    System.out.println(localDateTime);
    //2020-06-21T13:08:09.420
    System.out.println(localDateTime1);
    //minusXxx():给指定属性减少
    LocalDateTime localDateTime2 = localDateTime.minusDays(1);
    //2020-03-21T13:12:33.693
    System.out.println(localDateTime);
    //2020-03-20T13:12:33.693
    System.out.println(localDateTime2);
}

4.5 练习

@Test
public void test04(){
    //当前时间
    LocalDate today = LocalDate.now();
    System.out.println("Current Date="+today);
    //根据输入的参数获取日期
    LocalDate firstDay_2014 = LocalDate.of(2014, Month.JANUARY, 1);
    System.out.println("Specific Date="+firstDay_2014);
    //Try creating date by providing invalid inputs
    //LocalDate feb29_2014 = LocalDate.of(2014, Month.FEBRUARY, 29);
    //Exception in thread "main" java.time.DateTimeException:
    //Invalid date 'February 29' as '2014' is not a leap year
    //获取韩国当前的日期
    LocalDate todayKolkata = LocalDate.now(ZoneId.of("Asia/Kolkata"));
    System.out.println("Current Date in IST="+todayKolkata);
    //java.time.zone.ZoneRulesException: Unknown time-zone ID: IST
    //LocalDate todayIST = LocalDate.now(ZoneId.of("IST"));
    //获取从基数01/01/1970开始偏移365天的日期
    LocalDate dateFromBase = LocalDate.ofEpochDay(365);
    System.out.println("365th day from base date= "+dateFromBase);
    //获取2014年第100天后的日期
    LocalDate hundredDay2014 = LocalDate.ofYearDay(2014, 100);
    System.out.println("100th day of 2014="+hundredDay2014);
}

拓展:

1 瞬时
1.1 瞬时简介

​ instant:时间线上的一个瞬时点,可能被用来记录应用程序中的事件时间戳。对于人来说年月日时分秒,对于机器来说时间线中一个点就是一个很大的数,有利于计算的处理。UNIX中这个数从1970年开始(utc),以秒为单位,在java中以毫秒为单位。java.time包是基于纳秒计算的,所以instant可以精确到纳秒。

​ 常见的时间标准:

  • UTC:世界标准时间
  • GMT:格林尼治时间==>英国
  • CST:北京时间。UTC+8
1.2 瞬时简单使用
@Test
public void testInstant(){
    //1.实例化
    Instant now = Instant.now();
    //2020-03-15T05:33:31.729Z;;返回的是UTC的时间,如果是我们的时间就需要+8个小时
    System.out.println(now);
    //atOffset(ZoneOffset.ofHours(8)):根据时区添加偏移量
    OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
    //2020-03-15T13:37:00.750+08:00
    System.out.println(offsetDateTime);
    //toEpochMilli():获取1970年1月1日到现在的毫秒数。
    long l = now.toEpochMilli();
    System.out.println(l);
    //ofEpochMilli(l):根据指定的毫秒数获取指定对象。
    Instant instant = Instant.ofEpochMilli(l);
    //2020-03-15T05:40:53.664Z
    System.out.println(instant);
}
2 DateTimeFormatter
2.1 简介

​ 对时间进行本土化设置。

2.2 简单使用
@Test
public void testDateTimeFormat(){
    //方式一:预定义的标准格式。
    // 如:ISO_LOCAL_DATE_TIME
    DateTimeFormatter isoLocalDateTime = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    //格式化:
    LocalDateTime localDateTime = LocalDateTime.now();
    String format = isoLocalDateTime.format(localDateTime);
    //2020-03-15T14:50:06.953
    System.out.println(format);
    //解析:
    TemporalAccessor parse = isoLocalDateTime.parse(format);
    //{},ISO resolved to 2020-03-15T14:53:14.206
    System.out.println(parse);
    //方式二:本地化相关的操作:
    //ofLocalizedDateTime()
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
    //格式化:
    //风格:FormatStyle.SHORT,FormatStyle.LONG,FormatStyle.MEDIUM(适用于LocalDateTime)
    String format1 = dateTimeFormatter.format(localDateTime);
    //20-3-15 下午3:03
    System.out.println(format1);

    DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
    String format2 = dateTimeFormatter2.format(localDateTime);
    //2020年3月15日 下午03时03分01秒
    System.out.println(format2);

    DateTimeFormatter dateTimeFormatter3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    String format3 = dateTimeFormatter3.format(localDateTime);
    //2020-3-15 15:03:01
    System.out.println(format3);
    //风格:FormatStyle.FULL(适用于LocalDate以上三种风格也适用于LocalDate)
    LocalDate localDate = LocalDate.now();
    DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
    String format4 = dateTimeFormatter1.format(localDate);
    //2020年3月15日 星期日
    System.out.println(format4);
    //方式三:自定义格式:ofPattern("yyyy-MM-dd hh:mm:ss E")
    DateTimeFormatter dateTimeFormatter4 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss E");
    String format5 = dateTimeFormatter4.format(localDateTime);
    //2020-03-15 03:17:25 星期日
    System.out.println(format5);
    //解析
    TemporalAccessor parse1 = dateTimeFormatter4.parse(format5);
    //{SecondOfMinute=15, HourOfAmPm=3, NanoOfSecond=0, MicroOfSecond=0, MinuteOfHour=21, MilliOfSecond=0},ISO resolved to 2020-03-15
    System.out.println(parse1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值