20145330第七周《Java学习笔记》

20145330第七周《Java学习笔记》

第十三章 时间与日期

认识时间与日期

  • 时间的度量
    • GMT(格林威治标准时间):现在不是标准时间
    • 世界时(UT):1972年UTC出来之前,UT等价于GMT
    • 国际原子时(TAI):秒的定义
    • 世界协调时间(UTC):闰秒
    • Unix时间:1970.1.1 00:00开始的秒数
    • epoch:java.util.Date epoch毫秒数
  • 日历
    • 儒略历
    • 格里高利历
    • ISO860标准

认识Date与Calender

  • 时区
  • Date与DateFormat
    • Date只用来获取epoch毫秒数
    • DateFormat来格式化成人类理解的年月日时分秒
  • Calender:时间的运算
  • 有人会使用Date实例来取得系统事件描述,不过Date也是偏向机器的时间观点,例如:

    import java.util.*;
    import static java.lang.System.*;

    public class DateDemo {

    public static void main(String[] args) {
        Date date1 = new Date(currentTimeMillis());
        Date date2 = new Date();

        out.println(date1.getTime());
        out.println(date2.getTime());
    }
}

886442-20160416222125348-1113765194.png

  • 格式化时间日期的DateFormat
    • 通过DateFormat的各种静态方法进行格式化

    import java.util.*;
    import static java.lang.System.out;
    import static java.text.DateFormat.*;

    public class DateFoematDemo {
    public static void main(String[] args) {
        Date date = new Date();
        dateInstanceDemo(date);
        timeInstanceDemo(date);
        dateTimeInstanceDemo(date);
    }

    static void dateInstanceDemo(Date date) {
        out.println("getDateInstance() demo");
        out.printf("\tSHORT: %s%n", getDateInstance(LONG).format(date));
        out.printf("\tSHORT: %s%n", getDateInstance(SHORT).format(date));
    }

    static void timeInstanceDemo(Date date) {
        out.println("getTimeInstance() demo");
        out.printf("\tLONG: %s%n", getTimeInstance(LONG).format(date));
        out.printf("\tMEDIUM: %s%n", getTimeInstance(MEDIUM).format(date));
        out.printf("\tSHORT: %s%n",getTimeInstance(SHORT).format(date));
    }

    static void dateTimeInstanceDemo(Date date) {
        out.println("getDateTimeInstance() demo");
        out.printf("\tLONG: %s%n",
                getDateTimeInstance(LONG, LONG).format(date));
        out.printf("\tMEDIUM: %s%n",
                getDateTimeInstance(SHORT, MEDIUM).format(date));
        out.printf("\tSHORT: %s%n",
                getDateTimeInstance(SHORT, SHORT).format(date));
    }
}

886442-20160416222207895-1445437528.png

  • DateFormat是个抽象类,其操作类是java.text.SimpleDateFormat,你可以直接构建SimpleDateFormat实例,或是使用DateFormat的getDateInstance()、getTimeInstance()、getDateTimeInstance等静态方法,用较简便方式按不同需求取得SimpleDateFormat实例。

  • SimpleDateFormat还有个parse()方法,可以按构建SimpleDateFormat时指定的格式,将指定的字符串剖析为Date实例。如:


    import java.util.*;
    import java.text.*;

    public class HoeOld {

    public static void main(String[] args) throws Exception {
        System.out.print("输入出生年月日(yyyy-mm-dd):");
        DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
        Date birthDate = dateFormat.parse(new Scanner(System.in).nextLine());
        Date currentDate = new Date();
        long life = currentDate.getTime() - birthDate.getTime();
        System.out.println("你今年的岁数为:" +
                (life / (365 * 24 * 60 * 60 * 1000L)));
        }
    }

结果执行如图:
886442-20160416222234207-2144339636.png

886442-20160416222249473-1661892215.png

JDK8新时间日期API

  • 机器时间 Instant
  • 人类时间(ISO8601 标准)
    • LocalDateTime
    • LocalDate
    • LocalTime
    • ZonedDateTime
    • OffsetdateTime
    • Year
    • YearMonth
    • Month
    • MonthDay
    • TemporalAmount
    • TemporalUnit
    • TemporalAccessor
    • Chronology
  • 如果取得了Date实例,而想要改用Instance,则可以调用Date市里的toInstance()方法来取得,如果有个Instance实例,可以使用Date的静态方法from()转为Date。

  • LocalDateTime、LocalDate、LocalTime等类名称开头为Local,表示它们都只是对时间的描述,并没有时区信息。
  • 对于时间计量,新时间与日期API以类Duration来定义,可用于计量天、时、分、秒的时间差,精度调整可以达纳秒等级,而秒的最大值可以是long类型保存值。对于年、月、星期、日的时间差,则使用Period类定义。如:


    import java.time.*;
    import java.util.Scanner;
    import static java.lang.System.out;

    public class HowOld2 {

    public static void main(String[] args) {
        out.print("輸入出生年月日(yyyy-mm-dd):");
        LocalDate birth = LocalDate.parse(new Scanner(System.in).nextLine());
        LocalDate now = LocalDate.now();
        Period period = Period.between(birth, now);
        out.printf("你活了 %d 年 %d 月 %d 日%n", 
                period.getYears(), period.getMonths(), period.getDays());
        }
    }

执行结果如下:

886442-20160416222317723-955791113.png

886442-20160416222341770-406087767.png

年历系统设计

  • JDK8采用一年历系统设计,也就是说,java.time套件中的类在需要实行年历系统时都是采用单一的ISO8601年历系统。需要明确实行java.time.chrono.Chronology接口的类

学习中的问题和解决方法

  • 在时间计算中,时区的计算是非常困难的,在新的时间与日期API中个,UTC偏移量与时区的概念是分开的,OffsetDateTime单纯代表UTC偏移量,使用ISO 8601,如果有LocalDateTIme、LocalDate、Localtime
  • 也可以在分别补齐必要信息后,取得UTC偏移量。
  • 在运行DateFormatDemo中,提示它是公共的,应该在该文件的.java中声明,代码中定义的本来就为public class,DateFormatDemo。之后去除public之后就能成功运行了。

学习感受

这周的任务相对之前轻松一些,所以也有更多的时间将知识梳理与弄明白。而且还有时间去复习其他科的知识,让我感到十分充实。希望可以一直保持状态,进入良好的学习循环中。

代码托管截图

886442-20160416222403645-1050635884.png

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周200/2002/220/20
第二周300/5002/418/38
第三周500/10003/722/60
第四周300/13002/930/90
第五周200/15001/1018/108
第六周500/10002/1220/128
第七周300/13002/1420/148

转载于:https://www.cnblogs.com/20145330swx/p/5399605.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值