Java 8 日期和时间

声明

本文转自http://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant,以markdown格式整理,方便大家查看。

Java 8 Date – LocalDate, LocalDateTime, Instant

//JUNE 3, 2016 BY PANKAJ 4 COMMENTS//

Java 8 Date Time API is one of the most sought after change for developers. Java has been missing a consistent approach for Date and Time from start and Java 8 Date Time API is a welcome addition to the core Java APIs.

Why do we need new Java Date Time API?

Before we start looking at the Java 8 Date Time API, let’s see why do we need a new API for this. There have been several problems with the existing date and time related classes in java, some of them are:

  1. Java Date Time classes are not defined consistently, we have Date Class in both java.util as well as java.sql packages. Again formatting and parsing classes are defined in java.text package.

  2. java.util.Date contains both date and time, whereas java.sql.Date contains only date. Having this in java.sql package doesn’t make sense. Also both the classes have same name, that is a very bad design itself.

  3. There are no clearly defined classes for time, timestamp, formatting and parsing. We have java.text.DateFormat abstract class for parsing and formatting need. Usually SimpleDateFormat class is used for parsing and formatting.

  4. All the Date classes are mutable, so they are not thread safe. It’s one of the biggest problem with Java Date and Calendar classes.

  5. Date class doesn’t provide internationalization, there is no timezone support. So java.util.Calendar and java.util.TimeZone classes were introduced, but they also have all the problems listed above.

There are some other issues with the methods defined in Date and Calendar classes but above problems make it clear that a robust Date Time API was needed in Java. That’s why Joda Time played a key role as a quality replacement for Java Date Time requirements.

Java 8 Date

Java 8 Date Time API is JSR-310 implementation. It is designed to overcome all the flaws in the legacy date time implementations. Some of the design principles of new Date Time API are:

  1. Immutability: All the classes in the new Date Time API are immutable and good for multithreaded environments.

  2. Separation of Concerns: The new API separates clearly between human readable date time and machine time (unix timestamp). It defines separate classes for Date, Time, DateTime, Timestamp, Timezone etc.

  3. Clarity: The methods are clearly defined and perform the same action in all the classes. For example, to get the current instance we have now() method. There are format() and parse() methods defined in all these classes rather than having a separate class for them.

    All the classes use Factory Pattern and Strategy Pattern for better handling. Once you have used the methods in one of the class, working with other classes won’t be hard.

  4. Utility operations: All the new Date Time API classes comes with methods to perform common tasks, such as plus, minus, format, parsing, getting separate part in date/time etc.

  5. Extendable: The new Date Time API works on ISO-8601 calendar system but we can use it with other non ISO calendars as well.

Java 8 Date Time API Packages

Java 8 Date Time API consists of following packages.

  1. java.time Package: This is the base package of new Java Date Time API. All the major base classes are part of this package, such as LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration etc. All of these classes are immutable and thread safe. Most of the times, these classes will be sufficient for handling common requirements.

  2. java.time.chrono Package: This package defines generic APIs for non ISO calendar systems. We can extend AbstractChronology class to create our own calendar system.

  3. java.time.format Package: This package contains classes used for formatting and parsing date time objects. Most of the times, we would not be directly using them because principle classes in java.time package provide formatting and parsing methods.

  4. java.time.temporal Package: This package contains temporal objects and we can use it for find out specific date or time related to date/time object. For example, we can use these to find out the first or last day of the month. You can identify these methods easily because they always have format “withXXX”.

  5. java.time.zone Package: This package contains classes for supporting different time zones and their rules.

Java 8 Date Time API Examples

We have looked into most of the important parts of Java Date Time API. It’s time now to look into most important classes of Date Time API with examples.

1. LocalDate

LocalDate is an immutable class that represents Date with default format of yyyy-MM-dd. We can use now() method to get the current date. We can also provide input arguments for year, month and date to create LocalDate instance. This class provides overloaded method for now() where we can pass ZoneId for getting date in specific time zone. This class provides the same functionality as java.sql.Date. Let’s look at a simple example for it’s usage.

  1. package com.journaldev.java8.time;
  2. import java.time.LocalDate;
  3. import java.time.Month;
  4. import java.time.ZoneId;
  5. /**
  6. * LocalDate Examples
  7. * @author pankaj
  8. *
  9. */
  10. public class LocalDateExample {
  11. public static void main(String[] args) {
  12. //Current Date
  13. LocalDate today = LocalDate.now();
  14. System.out.println("Current Date="+today);
  15. //Creating LocalDate by providing input arguments
  16. LocalDate firstDay_2014 = LocalDate.of(2014, Month.JANUARY, 1);
  17. System.out.println("Specific Date="+firstDay_2014);
  18. //Try creating date by providing invalid inputs
  19. //LocalDate feb29_2014 = LocalDate.of(2014, Month.FEBRUARY, 29);
  20. //Exception in thread "main" java.time.DateTimeException:
  21. //Invalid date 'February 29' as '2014' is not a leap year
  22. //Current date in "Asia/Kolkata", you can get it from ZoneId javadoc
  23. LocalDate todayKolkata = LocalDate.now(ZoneId.of("Asia/Kolkata"));
  24. System.out.println("Current Date in IST="+todayKolkata);
  25. //java.time.zone.ZoneRulesException: Unknown time-zone ID: IST
  26. //LocalDate todayIST = LocalDate.now(ZoneId.of("IST"));
  27. //Getting date from the base date i.e 01/01/1970
  28. LocalDate dateFromBase = LocalDate.ofEpochDay(365);
  29. System.out.println("365th day from base date= "+dateFromBase);
  30. LocalDate hundredDay2014 = LocalDate.ofYearDay(2014, 100);
  31. System.out.println("100th day of 2014="+hundredDay2014);
  32. }
  33. }

LocalDate methods explanation is provided in comments, when we run this program, we get following output.

  1. Current Date=2014-04-28
  2. Specific Date=2014-01-01
  3. Current Date in IST=2014-04-29
  4. 365th day from base date= 1971-01-01
  5. 100th day of 2014=2014-04-10

2. LocalTime

LocalTime is an immutable class whose instance represents a time in the human readable format. It’s default format is hh:mm:ss.zzz. Just like LocalDate, this class provides time zone support and creating instance by passing hour, minute and second as input arguments. Let’s look at it’s usage with a simple program.

  1. package com.journaldev.java8.time;
  2. import java.time.LocalTime;
  3. import java.time.ZoneId;
  4. /**
  5. * LocalTime Examples
  6. * @author pankaj
  7. *
  8. */
  9. public class LocalTimeExample {
  10. public static void main(String[] args) {
  11. //Current Time
  12. LocalTime time = LocalTime.now();
  13. System.out.println("Current Time="+time);
  14. //Creating LocalTime by providing input arguments
  15. LocalTime specificTime = LocalTime.of(12,20,25,40);
  16. System.out.println("Specific Time of Day="+specificTime);
  17. //Try creating time by providing invalid inputs
  18. //LocalTime invalidTime = LocalTime.of(25,20);
  19. //Exception in thread "main" java.time.DateTimeException:
  20. //Invalid value for HourOfDay (valid values 0 - 23): 25
  21. //Current date in "Asia/Kolkata", you can get it from ZoneId javadoc
  22. LocalTime timeKolkata = LocalTime.now(ZoneId.of("Asia/Kolkata"));
  23. System.out.println("Current Time in IST="+timeKolkata);
  24. //java.time.zone.ZoneRulesException: Unknown time-zone ID: IST
  25. //LocalTime todayIST = LocalTime.now(ZoneId.of("IST"));
  26. //Getting date from the base date i.e 01/01/1970
  27. LocalTime specificSecondTime = LocalTime.ofSecondOfDay(10000);
  28. System.out.println("10000th second time= "+specificSecondTime);
  29. }
  30. }

When we run above program for LocalTime examples, we get following output.

  1. Current Time=15:51:45.240
  2. Specific Time of Day=12:20:25.000000040
  3. Current Time in IST=04:21:45.276
  4. 10000th second time= 02:46:40

3. LocalDateTime

LocalDateTime is an immutable date-time object that represents a date-time, with default format as yyyy-MM-dd-HH-mm-ss.zzz. It provides a factory method that takes LocalDate and LocalTime input arguments to create LocalDateTime instance. Let’s look it’s usage with a simple example.

  1. package com.journaldev.java8.time;
  2. import java.time.LocalDate;
  3. import java.time.LocalDateTime;
  4. import java.time.LocalTime;
  5. import java.time.Month;
  6. import java.time.ZoneId;
  7. import java.time.ZoneOffset;
  8. public class LocalDateTimeExample {
  9. public static void main(String[] args) {
  10. //Current Date
  11. LocalDateTime today = LocalDateTime.now();
  12. System.out.println("Current DateTime="+today);
  13. //Current Date using LocalDate and LocalTime
  14. today = LocalDateTime.of(LocalDate.now(), LocalTime.now());
  15. System.out.println("Current DateTime="+today);
  16. //Creating LocalDateTime by providing input arguments
  17. LocalDateTime specificDate = LocalDateTime.of(2014, Month.JANUARY, 1, 10, 10, 30);
  18. System.out.println("Specific Date="+specificDate);
  19. //Try creating date by providing invalid inputs
  20. //LocalDateTime feb29_2014 = LocalDateTime.of(2014, Month.FEBRUARY, 28, 25,1,1);
  21. //Exception in thread "main" java.time.DateTimeException:
  22. //Invalid value for HourOfDay (valid values 0 - 23): 25
  23. //Current date in "Asia/Kolkata", you can get it from ZoneId javadoc
  24. LocalDateTime todayKolkata = LocalDateTime.now(ZoneId.of("Asia/Kolkata"));
  25. System.out.println("Current Date in IST="+todayKolkata);
  26. //java.time.zone.ZoneRulesException: Unknown time-zone ID: IST
  27. //LocalDateTime todayIST = LocalDateTime.now(ZoneId.of("IST"));
  28. //Getting date from the base date i.e 01/01/1970
  29. LocalDateTime dateFromBase = LocalDateTime.ofEpochSecond(10000, 0, ZoneOffset.UTC);
  30. System.out.println("10000th second time from 01/01/1970= "+dateFromBase);
  31. }
  32. }

In all the three examples, we have seen that if we provide invalid arguments for creating Date/Time, then it throws java.time.DateTimeException that is a RuntimeException, so we don’t need to explicitly catch it.

We have also seen that we can get Date/Time data by passing ZoneId, you can get the list of supported ZoneId values from it’s javadoc. When we run above class, we get following output.

  1. Current DateTime=2014-04-28T16:00:49.455
  2. Current DateTime=2014-04-28T16:00:49.493
  3. Specific Date=2014-01-01T10:10:30
  4. Current Date in IST=2014-04-29T04:30:49.493
  5. 10000th second time from 01/01/1970= 1970-01-01T02:46:40

4. Instant

Instant class is used to work with machine readable time format, it stores date time in unix timestamp. Let’s see it’s usage with a simple program.

  1. package com.journaldev.java8.time;
  2. import java.time.Duration;
  3. import java.time.Instant;
  4. public class InstantExample {
  5. public static void main(String[] args) {
  6. //Current timestamp
  7. Instant timestamp = Instant.now();
  8. System.out.println("Current Timestamp = "+timestamp);
  9. //Instant from timestamp
  10. Instant specificTime = Instant.ofEpochMilli(timestamp.toEpochMilli());
  11. System.out.println("Specific Time = "+specificTime);
  12. //Duration example
  13. Duration thirtyDay = Duration.ofDays(30);
  14. System.out.println(thirtyDay);
  15. }
  16. }

Output of above program is:

  1. Current Timestamp = 2014-04-28T23:20:08.489Z
  2. Specific Time = 2014-04-28T23:20:08.489Z
  3. PT720H

5. Java 8 Date API Utilities

As mentioned earlier, most of the Date Time principle classes provide various utility methods such as plus/minus days, weeks, months etc. There are some other utility methods for adjusting the date using TemporalAdjuster and to calculate the period between two dates.

  1. package com.journaldev.java8.time;
  2. import java.time.LocalDate;
  3. import java.time.LocalTime;
  4. import java.time.Period;
  5. import java.time.temporal.TemporalAdjusters;
  6. public class DateAPIUtilities {
  7. public static void main(String[] args) {
  8. LocalDate today = LocalDate.now();
  9. //Get the Year, check if it's leap year
  10. System.out.println("Year "+today.getYear()+" is Leap Year? "+today.isLeapYear());
  11. //Compare two LocalDate for before and after
  12. System.out.println("Today is before 01/01/2015? "+today.isBefore(LocalDate.of(2015,1,1)));
  13. //Create LocalDateTime from LocalDate
  14. System.out.println("Current Time="+today.atTime(LocalTime.now()));
  15. //plus and minus operations
  16. System.out.println("10 days after today will be "+today.plusDays(10));
  17. System.out.println("3 weeks after today will be "+today.plusWeeks(3));
  18. System.out.println("20 months after today will be "+today.plusMonths(20));
  19. System.out.println("10 days before today will be "+today.minusDays(10));
  20. System.out.println("3 weeks before today will be "+today.minusWeeks(3));
  21. System.out.println("20 months before today will be "+today.minusMonths(20));
  22. //Temporal adjusters for adjusting the dates
  23. System.out.println("First date of this month= "+today.with(TemporalAdjusters.firstDayOfMonth()));
  24. LocalDate lastDayOfYear = today.with(TemporalAdjusters.lastDayOfYear());
  25. System.out.println("Last date of this year= "+lastDayOfYear);
  26. Period period = today.until(lastDayOfYear);
  27. System.out.println("Period Format= "+period);
  28. System.out.println("Months remaining in the year= "+period.getMonths());
  29. }
  30. }

Output of above program is:

  1. Year 2014 is Leap Year? false
  2. Today is before 01/01/2015? true
  3. Current Time=2014-04-28T16:23:53.154
  4. 10 days after today will be 2014-05-08
  5. 3 weeks after today will be 2014-05-19
  6. 20 months after today will be 2015-12-28
  7. 10 days before today will be 2014-04-18
  8. 3 weeks before today will be 2014-04-07
  9. 20 months before today will be 2012-08-28
  10. First date of this month= 2014-04-01
  11. Last date of this year= 2014-12-31
  12. Period Format= P8M3D
  13. Months remaining in the year= 8

6. Java 8 Date Parsing and Formatting

It’s very common to format date into different formats and then parse a String to get the Date Time objects. Let’s see it with simple examples.

  1. package com.journaldev.java8.time;
  2. import java.time.Instant;
  3. import java.time.LocalDate;
  4. import java.time.LocalDateTime;
  5. import java.time.format.DateTimeFormatter;
  6. public class DateParseFormatExample {
  7. public static void main(String[] args) {
  8. //Format examples
  9. LocalDate date = LocalDate.now();
  10. //default format
  11. System.out.println("Default format of LocalDate="+date);
  12. //specific format
  13. System.out.println(date.format(DateTimeFormatter.ofPattern("d::MMM::uuuu")));
  14. System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE));
  15. LocalDateTime dateTime = LocalDateTime.now();
  16. //default format
  17. System.out.println("Default format of LocalDateTime="+dateTime);
  18. //specific format
  19. System.out.println(dateTime.format(DateTimeFormatter.ofPattern("d::MMM::uuuu HH::mm::ss")));
  20. System.out.println(dateTime.format(DateTimeFormatter.BASIC_ISO_DATE));
  21. Instant timestamp = Instant.now();
  22. //default format
  23. System.out.println("Default format of Instant="+timestamp);
  24. //Parse examples
  25. LocalDateTime dt = LocalDateTime.parse("27::Apr::2014 21::39::48",
  26. DateTimeFormatter.ofPattern("d::MMM::uuuu HH::mm::ss"));
  27. System.out.println("Default format after parsing = "+dt);
  28. }
  29. }

When we run above program, we get following output.

  1. Default format of LocalDate=2014-04-28
  2. 28::Apr::2014
  3. 20140428
  4. Default format of LocalDateTime=2014-04-28T16:25:49.341
  5. 28::Apr::2014 16::25::49
  6. 20140428
  7. Default format of Instant=2014-04-28T23:25:49.342Z
  8. Default format after parsing = 2014-04-27T21:39:48

7. Java 8 Date API Legacy Date Time Support

Legacy Date/Time classes are used in almost all the applications, so having backward compatibility is a must. That’s why there are several utility methods through which we can convert Legacy classes to new classes and vice versa. Let’s see this with a simple example.

  1. package com.journaldev.java8.time;
  2. import java.time.Instant;
  3. import java.time.LocalDateTime;
  4. import java.time.ZoneId;
  5. import java.time.ZonedDateTime;
  6. import java.util.Calendar;
  7. import java.util.Date;
  8. import java.util.GregorianCalendar;
  9. import java.util.TimeZone;
  10. public class DateAPILegacySupport {
  11. public static void main(String[] args) {
  12. //Date to Instant
  13. Instant timestamp = new Date().toInstant();
  14. //Now we can convert Instant to LocalDateTime or other similar classes
  15. LocalDateTime date = LocalDateTime.ofInstant(timestamp,
  16. ZoneId.of(ZoneId.SHORT_IDS.get("PST")));
  17. System.out.println("Date = "+date);
  18. //Calendar to Instant
  19. Instant time = Calendar.getInstance().toInstant();
  20. System.out.println(time);
  21. //TimeZone to ZoneId
  22. ZoneId defaultZone = TimeZone.getDefault().toZoneId();
  23. System.out.println(defaultZone);
  24. //ZonedDateTime from specific Calendar
  25. ZonedDateTime gregorianCalendarDateTime = new GregorianCalendar().toZonedDateTime();
  26. System.out.println(gregorianCalendarDateTime);
  27. //Date API to Legacy classes
  28. Date dt = Date.from(Instant.now());
  29. System.out.println(dt);
  30. TimeZone tz = TimeZone.getTimeZone(defaultZone);
  31. System.out.println(tz);
  32. GregorianCalendar gc = GregorianCalendar.from(gregorianCalendarDateTime);
  33. System.out.println(gc);
  34. }
  35. }

When we run above application, we get following output.

  1. Date = 2014-04-28T16:28:54.340
  2. 2014-04-28T23:28:54.395Z
  3. America/Los_Angeles
  4. 2014-04-28T16:28:54.404-07:00[America/Los_Angeles]
  5. Mon Apr 28 16:28:54 PDT 2014
  6. sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
  7. java.util.GregorianCalendar[time=1398727734404,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Los_Angeles",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2014,MONTH=3,WEEK_OF_YEAR=18,WEEK_OF_MONTH=5,DAY_OF_MONTH=28,DAY_OF_YEAR=118,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=28,SECOND=54,MILLISECOND=404,ZONE_OFFSET=-28800000,DST_OFFSET=3600000]

As you can see that legacy TimeZone and GregorianCalendar classes toString() methods are too verbose and not user friendly.

summary

That’s all for Java 8 Date Time API, I like this new API a lot. Some of the most used classes will be LocalDate and LocalDateTime for this new API. It’s very easy to work with and having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worthy of the time.

[转载]Java 8 日期&时间 API的更多相关文章

  1. Java 8 新特性-菜鸟教程 (8) -Java 8 日期时间 API

    Java 8 日期时间 API Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: ...

  2. Java 8 日期时间 API

    转自:https://www.runoob.com/java/java8-datetime-api.html Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与 ...

  3. Java 8 日期时间API

    Java 8一个新增的重要特性就是引入了新的时间和日期API,它们被包含在java.time包中.借助新的时间和日期API可以以更简洁的方法处理时间和日期; 在介绍本篇文章内容之前,我们先来讨论Jav ...

  4. Java中日期时间API小结

    Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...

  5. Java 8 日期时间API使用介绍

    如何正确处理时间 现实生活的世界里,时间是不断向前的,如果向前追溯时间的起点,可能是宇宙出生时,又或是是宇宙出现之前, 但肯定是我们目前无法找到的,我们不知道现在距离时间原点的精确距离.所以我们要表示 ...

  6. 【转】JAVA 8 日期/时间(Date Time)API指南

    前言 本来想写下Java 8的日期/时间API,发现已经有篇不错的文章了,那就直接转载吧~ PS:主要内容没变,做了部分修改. 原文链接: journaldev 翻译: ImportNew.com - ...

  7. 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API

    https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...

  8. Java 8 新日期时间 API

    Java 8 新日期时间 API 1. LocalDate.LocalTime.LocalDateTime LocalDate.LocalTime.LocalDateTime 实例是不可变的对象,分别 ...

  9. Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

随机推荐

  1. .NET 提升教育 第一期:VIP 付费课程培训通知!

    为响应 @当年在远方 同学的建议,在年前尝试进行一次付费的VIP培训. 培训的课件:点击下载培训周期:10个课程左右,每晚1个半小时培训价格:1000元/人.报名方式:有意向的请加QQ群:路过秋天.N ...

  2. SSH实战 · 唯唯乐购项目(中)

    用户模块 三:一级分类的查询 创建一级分类表并导入基本数据 CREATE TABLE `category` (   `cid` int(11) NOT NULL AUTO_INCREMENT,   ` ...

  3. fiddler发送post请求

    1.指定为 post 请求,输入 url Content-Type: application/x-www-form-urlencoded;charset=utf-8 request body中的参数格 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(75)-微信公众平台开发-用户管理

    系列目录 前言 本节主要是关注者(即用户)和用户组的管理,微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号也提供了相应的接口 ...

  5. Angular企业级开发(2)-搭建Angular开发环境

    1.集成开发环境 个人或团队开发AngularJS项目时,有很多JavaScript编辑器可以选择.使用优秀的集成开发环境(Integrated Development Environment)能节省 ...

  6. jquery.Callbacks的实现

    前言 本人是一个热爱前端的菜鸟,一直喜欢学习js原生,对于jq这种js库,比较喜欢理解他的实现,虽然自己能力有限,水平很低,但是勉勉强强也算是能够懂一点吧,对于jq源码解读系列,博客园里有很多,推荐大 ...

  7. javascript中的事件冒泡和事件捕获

    1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...

  8. JS继承之寄生类继承

    原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...

  9. 【HanLP】资料链接汇总

    Java中调用HanLP配置 HanLP自然语言处理包开源官方文档 了解HanLP的全部 自然语言处理HanLP 开源自由的汉语言处理包主页 GitHub源码 基于hanLP的中文分词详解-MapRe ...

  10. iOS之App Store上架被拒Legal - 5.1.5问题

    今天在看到App Store 上架过程中,苹果公司反馈的拒绝原因发现了这么一个问题: Legal - 5.1.5 Your app uses background location services ...