日期和API

  Java1.0对日期和时间的支持只能依赖java.util.Date类,年份的起始选择是1900你那,月份的起始是从0开始计算的。它的返回值中包含了JVM的默认市区CET,即中欧时间。在Java1.1中使用java.util.Calendar类替代Date。同时格式化和解析日期的DateFormat也只存在于Date中,并且线程不安全。Date和Calendar都是可变的。Java8在java.time中整合了很多Joda-Time的特性。

  java.time提供了LocalDate,LocalTime,Instant,Duration和Period。

  

  LocalDate和LocalTime

    LocalDate和LocalTime的实例都是一个不可变对象,LocalDate只提供了简单的日期,并不包含当天的时间信息,它也不附带任何跟时区相关任何信息。LocalTime只提供了时间。

    TemporalField是一个接口,它可以定义访问temporal对象某个字段的值。ChronoField枚举实现了这个接口,可以使用LocalDate.get(ChronoField)获取某个枚举元素的值。

      int year = LocalDate.now().get(ChronoField.YEAR);

    LocalDate和LocalTime都可以通过parse()方法解析代表它们的字符串创建。也可以向parse()方法传递一个DateTimeFormatter,它是替换java.util.DateFormat的替代品。一旦传递的字符串参数无法被解析为合法的LocalDate或LocalTime对象,这两个parse方法都会抛出DateTimeParseException异常。

      LocalDate date = LocalDate.parse("2017-07-24");

      LocalTime time = LocalTime.parse("12:25:05");

  LocalDateTime

    LocalDateTime是LocalDate和LocalTime的合体,表示了日期和时间,但不带有时区。可以LocalDate和LocalTime可以通过atTime()和atDate()方法创建一个LocalDateTime对象,也可调用LocalDateTime的toLocalDate()和toLocalTime()方法生成LocalDate和LocalTime对象。

    LocalDateTime dateTime = LocalDateTime.of(2017, Month.JULY, 24, 11, 11, 11);    LocalDate date = LocalDate.now();    LocalTime time = LocalTime.now();    LocalDateTime dateTime1 = LocalDateTime.of(date, time);    LocalDateTime dateTime2 = date.atTime(11, 11);    LocalDateTime dateTime3 = date.atTime(time);    LocalDateTime dateTime4 = time.atDate(date);    LocalDate date1 = dateTime.toLocalDate();    LocalTime time1 = dateTime1.toLocalTime();

  从计算机的角度来看,建模时间最自然的格式是表示一个持续时间段上某个点的单一大整型数。java.time.Instant类对时间建模的方式是以Unix元年时间开始所经历的秒数进行计算。可以通过静态工厂方法ofEpochSecond传递一个代表描述的值创建一个该类的实例,它也可以接收第二个以秒为单位的参数值,对传入作为描述的参数进行调整。重载的版本会调整纳秒参数,确保保存的纳秒分片在0到999999传入作为秒数的参数进行调整。Instant类支持静态工厂方法now,它能够帮你获取当前时刻的时间戳。

    Instant.ofEpochSecond(3);

    Instant.ofEpochSecond(2, 1000000000); //2s后再加上1s

    Instant.ofEpochSecond(2, -1000000000); //2s之前1s

  Duration或Period

    Temporal接口定义了如何读取和操纵为时间建模的对象的值。Duration类的静态工厂between可以计算两个Temporal对象之间的duration。

      Duration d1 = Duration.between(time1, time2);

      Duration d2 = Duration.between(datetime1, datetime2);

      Duration d3 = Duration.between(instant1, instant1);

    若试图在Instant和LocalDateTime对象之间创建duration,会触发DateTimeException异常。

    若需要以年,月或日的方式对多个时间建模,可以用Period类。

      Period tenDays = Period.between(LocalDate.of(2014, 3, 18), LocalDate.of(2014, 3, 18));

  

    static between  创建两个时间点之间的interval

    static from     由一个临时时间点创建interval

    static of     由它的组成部分创建interval实例

    static parse      由字符串创建interval的实例

    addTo       创建该interval的副本,并将其叠加到某个指定的temporal对象

    get         读取该interval的副本,并将其叠加到某个指定的temporal对象

    isNegative     检查该interval是否为负值,不包含0

    isZero         检查该interval的时常是否为0

    minus       通过减去一定的时间创建该interval的副本

      multipliedPlay      将interval的值乘以某个标量创建该interval的副本

    negated        以忽略某个时长的方式创建该interval副本

    plus        以增加某个指定的时长的方式创建该interval的副本

    substractFrom     从指定的temporal对象中减去该interval  

  

  创建一个LocalDate对象的修改版,最简单的方式withAttribute方法。withAttribute方法对创建对象的一个副本,并按照需要修改它的属性。通过使用get和with方法,可以将Temporal对象值读取和修改区分开。若Temporal对象不支持请求访问的字段,它会抛出一个UnsupportedTemporalTypeException异常。

    LocalDate date1 = LocalDate.of(2014, 3, 18);

    LocalDate date2 = date1.withYear(2011);

    LocalDate date3 = date2.withDayOfMonth(25);

    LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);

    表示时间点的日期-时间类的通用方法

  static from  依据传入的Temporal对象创建对象实例

  static now   依据系统时钟创建Temporal对象

  static of    由Temporal镀锡爱过你的某个部分创建该对象的实例

  static parse   由字符串创建Temporal对象的实例

  atOffset    将Temporal对象和某个时区偏移相结合

  atZone      将Temporal对象和某个时区相结合

  format    使用某个指定的格式将Temporal对象转换为字符串

  get       读取Temporal对象的某一部分的值

  minus     创建Temporal对象的一个副本,通过将当前的Temporal对象的值减去一定时长创建该副本

  plus      创建Temporal对象的一个副本,通过将当前的Temporal对象的值加上一顶时长创建该副本

  with     以该Temporal对象为模板,对某些状态进行修改创建该对象的副本

  TemporalAdjuster  

    LocalDate的with方法可以接受一个TemporalAdjuster对象。

      LocalDate date1 = LocalDate.of(2014, 3, 18);

      LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));

      TemporalAdjuster类中的工厂方法

  dayOfWeekInMonth  创建一个新的日期,它的值为同一个月中每一周的第几天

  firstDayOfMonth    创建一个新的日期,它的值为当月的第一天

  firstDayOfNextMonth    创建一个新的日期,它的值为下月的第一天

  firstDayOfNextYear  创建一个新的日期,它的值为明年的第一天

  firstDayOfYear    创建一个新的日期,它的值为当年的第一天

  firstInMonth      创建一个新的日期,它的值为当月的第一天

  lastDayOfMonth    创建一个新的日期,它的值为当月的最后一天

  lastDayOfNextMonth    创建一个新的日期,它的值为下个月的最后一天

  lastDayOfNextYear      创建一个新的日期,它的值为明年的最后一天

lastDayOfYear    创建一个新的日期,它的值为今年最后一天

  lastInMonth        创建一个新的日期,它的值为同一个月中,最后一个符合星期几要求的值

  next/previous     创建一个新的日期,并将其设定为日期调整后或者调整前,第一个符合指定星期内要求的日期

  nextOrSame/previousOrSame  创建一个新的日期,并将其值设定为日期调整后或调整前,第一个符合指定星期几要求的日期,若该日期已经符合要求,直接返回该对象

  

  @FunctionalInterface

  public interface TemporalAdjuster{

    Temporal adjustInto(Temporal temporal);

  }

  

public class NextWorkingDay implements TemproalAdjuster{
  public Temporal adjustInto(Temporal temporal){
    DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
    int dayOfAdd = 1;
    if( dow == DayOfWeek.FRIDAY)
        dayOfAdd = 3;
    else if( dow == DayOfWeek.SATURDAY){
        dayOfAdd = 2;
    }
    return temporal.plus(dayToAdd, ChronoUnit.DAYS);
  }
}

date = date.with( temporal -> {
    public Temporal adjustInto(Temporal temporal){
    DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
    int dayOfAdd = 1;
    if( dow == DayOfWeek.FRIDAY)
        dayOfAdd = 3;
    else if( dow == DayOfWeek.SATURDAY){
        dayOfAdd = 2;
    }
    return temporal.plus(dayToAdd, ChronoUnit.DAYS);
});

TemporalAdjuster nextWorkingDay = TemporalAdjuster.ofDateAdjust(
  temporal -> {
    DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
    int dayOfAdd = 1;
    if( dow == DayOfWeek.FRIDAY)
        dayOfAdd = 3;
    else if( dow == DayOfWeek.SATURDAY){
        dayOfAdd = 2;
    }
    return temporal.plus(dayToAdd, ChronoUnit.DAYS);
});    

date = date.with(nextWorkingDay)

  java.time.format用于格式化及解析日期-时间。DateTimeFormatter实例用于以一定的格式创建代表特定日期或时间的字符串,并且线程安全。

    LocalDate date = LocalDate.of(2017, 8, 9);

    String s1 = data.format(DateTimeFormatter.BASIC_ISO_DATE); //20170809

    String s2 = data.format(DateTimeFormatter.ISO_LOCAL_DATE); //2017-08-09

    LocalDate date1 = LocalDate.parse("20170809", DateTimeFormatter.BASIC_ISO_DATE);

  DateTimeFormatter.ofPattern()方法可以按照某个特定的模式创建格式器,ofPattern()方法还可以创建某个Locale的格式器

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");

    DateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN);

    

  java.time.ZoneId的目的是让你无需为时区处理复杂和繁琐操心。通过调用ZoneId.getRules()得到指定的市区规则。每个特定的ZoneId对象都由一个地区ID标识。

    ZoneId romeZone = ZoneId.of("Europe/Rome");

  地区ID都为“区域/城市”的格式,这些地区集合的设定都由英特网编号分配机构IANA的时区数据库提供。可以通过toZoneId将一个老时区对象转换为ZoneId。ZoneId与LocalDate,LocalDateTime或Instant整合可以得到ZonedDateTime实例

    ZoneId zoneId = ZoneId.getDefault().toZoneId();

    LocalDate date = LocalDate.of(2014, Month.MARCH, 10);

    ZonedDateTime zdt = date.atStartOfDay(zoneId);

    LocalDateTime datetime = LocalDateTime.of(2014, Month.MARCH, 10, 18, 13, 45);

    zdt = datetime.atZone(romeZone);

    Instant instant = Instant.now();

    zdt = instant.atZone(romeZone);

    Instant instantFromDateTime = dateTime.toInstant(romeZone);

    LocalDateTime dateTimeFromInstant = LocalDateTime.ofInstant(instant, romeZone);

  ISO-8601日历系统是世界文明日历系统的实施标准。Java8还提供呢了4种其它的日历系统。分别是ThaiBuddhistDate,MinguoDate,JapaneseDate以及HijrahDate。这些类及LocalDate都实现了ChronoLocalDate接口。

    LocalDate date = LocalDate.of(2014, Month.MARCH, 10);

    JapeneseDate jDate = JapeneseDate.from(date);

    Chronology japaneseChronology = Chronology.ofLocale(Locale.JANPAN);

    ChronoLocalDate now = japaneseChronology.dateNow();

时间: 2024-10-05 04:19:22

日期和API的相关文章

Java8 日期时间API

使用Java8,新的日期时间API引入覆盖旧的日期时间API的以下缺点. 非线程安全 - java.util.Date不是线程安全的,因此开发者必须在使用日期处理并发性问题.新的日期时间API是不可变的,并且没有setter方法. 设计不佳 - 默认的开始日期从1900年,开始每月从1天从0开始,所以没有统一.不直接使用方法操作日期.新的API提供了这样操作实用方法. 困难的时区处理 - 开发人员必须编写大量的代码来处理时区的问题.新的API设计开发保持特定领域设计. JAVA8引入了java.

Java 8 新特性:Java 类库的新特性之日期时间API (Date/Time API ) ——诺诺"涂鸦"记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  日期时间API (Date/Time API ) 1.Java8之前java.util.Date和Calendar类的弊端 1)最开始的时候,Date既要承载日期信息,又要做日期之间的转换,还要做不同日期格式的显示,职责较繁杂(不遵守单一职责). 后来从JDK 1.1 开始,这三项职责分开了: 使用Calendar类实现日期和

Java 8 日期时间 API

Java 8 日期时间 API Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: 非线程安全 ? java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一. 设计很差 ? Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义.java.ut

日期时间API

Java 8 通过发布新的Date-Time API来进一步加强对日期与时间的处理. 在旧版的Java中,日期时间API存在诸多问题其中有 非线程安全 - java.util.Date是非线程安全的,所有日期类都是可变的,这是Java日期类最大的问题之一. 设计很差 - Java日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义.java.util.Date同事包含日期和时间,而java.sql.Date仅包含

全面解析Java日期时间API

时区 GMT(Greenwich Mean Time):格林尼治时间,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间. UTC(Universal Time Coordinated):统一协调时间,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间,标准 UTC 时间格式 yyyy-MM-dd'T'HH:mm:ss.SSSXXX. 格林尼治时间已经不再被作为标准时间使用,UTC 是最主要的世界时间标准. Java提供了获取当前时间的方法 Syst

java常用类详细介绍及总结:字符串相关类、日期时间API、比较器接口、System、Math、BigInteger与BigDecimal

一.字符串相关的类 1.String及常用方法 1.1 String的特性 String:字符串,使用一对""引起来表示. String声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的. 实现了Comparable接口:表示String可以比较大小 String内部定义了final char[] value用于存储字符串数据 String:代表不可变的字符序列.简称:不可变性. 体现: 当对字符串重新赋值时,需要重写指定内存区域赋

Java基础第二十一天总结——日期时间API

目录: 一.JDK8之前的日期时间API 二.JDK8中新日期时间API 三.Java比较器 四.System类 五.Math类 六.Biglenteger与BigDecimal /*-----------------------分割线-----------------------------*/ 一.JDK8之前的日期时间API java.util.Date类 表示特定的瞬时,精确到毫秒 构造器: Date() Date(long date) 常用方法: getTime() toString(

Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点

1.不变性 新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处. 比如:LocalDateTime 2.关注点分离 新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date).时间(Time).日期时间(DateTime).时间戳(unix timestamp)以及时区定义了不同的类. 不同时间分解成了各个类,比如:LocalDate, LocalTime, LocalDateTime, Instant,Year,Month,YearMo

Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总结 0.前言 通过前面Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中主要的类关系简图如下: 可以看出主要的LocalDate, LocalTime, LocalDateTime, Instant都是实现相同的接口,这里以LocalDate为例分析jav

20191227 Java8 日期时间API

背景 Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: 非线程安全 ? java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一. 设计很差 ? Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义.java.util.Date同时包含日期