<div id="cnblogs\_post\_body" class="blogpost-body"><p>一、简介</p> <p> 在Java8之前,日期时间API一直被开发者诟病,包括:java.util.Date是可变类型,SimpleDateFormat非线程安全等问题。故此,Java8引入了一套全新的日期时间处理API,新的API基于ISO标准日历系统。</p> <p> </p> <p>二、日期初识</p> <p> 示例1: 获取当天日期</p> <p> Java 8中的 LocalDate 用于表示当天日期。和java.util.Date不同,它只有日期,不包含时间。</p> <div class="cnblogs\_code"> <pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) { LocalDate date </span>=<span style="color: #000000;"> LocalDate.now(); System.out.println(</span>"当前日期=" +<span style="color: #000000;"> date); }</span></pre> </div> <p> </p> <p> 示例2: 构造指定日期</p> <p> 调用工厂方法LocalDate.of()创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例。这个方法的好处是没再犯老API的设计错误,比如年度起始于1900,月份是从0开 始等等</p> <div class="cnblogs\_code"> <pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) { LocalDate date </span>= LocalDate.of(2000, 1, 1<span style="color: #000000;">); System.out.println(</span>"千禧年=" +<span style="color: #000000;"> date); }</span></pre> </div> <p> </p> <p> 示例3: 获取年月日信息</p> <div class="cnblogs\_code"> <pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) { LocalDate date </span>=<span style="color: #000000;"> LocalDate.now(); System.out.printf(</span>"年=%d, 月=%d, 日=%d"<span style="color: #000000;">, date.getYear(), date.getMonthValue(), date.getDayOfMonth()); }</span></pre> </div> <p> </p> <p> 示例4: 比较两个日期是否相等</p> <div class="cnblogs\_code"> <pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) { LocalDate now </span>=<span style="color: #000000;"> LocalDate.now(); LocalDate date </span>= LocalDate.of(2018, 9, 24<span style="color: #000000;">); System.out.println(</span>"日期是否相等=" +<span style="color: #000000;"> now.equals(date)); }</span></pre> </div> <p> </p> <p>三、时间初识</p> <p> 示例: 获取当前时间</p> <p> Java 8中的 LocalTime 用于表示当天时间。和java.util.Date不同,它只有时间,不包含日期。</p> <div class="cnblogs\_code"> <pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) { LocalTime time </span>=<span style="color: #000000;"> LocalTime.now(); System.out.println(</span>"当前时间=" +<span style="color: #000000;"> time); }</span></pre> </div> <p> </p> <p>四、比较与计算</p> <p> 示例1: 日期时间计算</p> <p> Java8提供了新的plusXxx()方法用于计算日期时间增量值,替代了原来的add()方法。新的API将返回一个全新的日期时间示例,需要使用新的对象进行接收。</p> <div class="cnblogs\_code"><div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) { <br> // 时间增量 LocalTime time </span>=<span style="color: #000000;"> LocalTime.now(); LocalTime newTime </span>= time.plusHours(2<span style="color: #000000;">); System.out.println(</span>"newTime=" +<span style="color: #000000;"> newTime); <br> // 日期增量 LocalDate date </span>=<span style="color: #000000;"> LocalDate.now(); LocalDate newDate </span>= date.plus(1<span style="color: #000000;">, ChronoUnit.WEEKS); System.out.println(</span>"newDate=" +<span style="color: #000000;"> newDate);
}</span></pre>
<div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p> </p> <p> 示例2: 日期时间比较</p> <p> Java8提供了isAfter()、isBefore()用于判断当前日期时间和指定日期时间的比较</p> <div class="cnblogs\_code"><div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) {
LocalDate now </span>=<span style="color: #000000;"> LocalDate.now();
LocalDate date1 </span>= LocalDate.of(2000, 1, 1<span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (now.isAfter(date1)) {
System.out.println(</span>"千禧年已经过去了"<span style="color: #000000;">);
}
LocalDate date2 </span>= LocalDate.of(2020, 1, 1<span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (now.isBefore(date2)) {
System.out.println(</span>"2020年还未到来"<span style="color: #000000;">);
}
}</span></pre>
<div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p> </p> <p>五、时区</p> <p> 示例: 创建带有时区的日期时间</p> <p> Java 8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类如ZoneId来处理特定时区,ZoneDateTime类来表示某时区下的时间。</p> <div class="cnblogs\_code"><div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 上海时间</span>
ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai"<span style="color: #000000;">);
ZonedDateTime shanghaiZonedDateTime </span>=<span style="color: #000000;"> ZonedDateTime.now(shanghaiZoneId);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 东京时间</span>
ZoneId tokyoZoneId = ZoneId.of("Asia/Tokyo"<span style="color: #000000;">);
ZonedDateTime tokyoZonedDateTime </span>=<span style="color: #000000;"> ZonedDateTime.now(tokyoZoneId);
DateTimeFormatter formatter </span>= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"<span style="color: #000000;">);
System.out.println(</span>"上海时间: " +<span style="color: #000000;"> shanghaiZonedDateTime.format(formatter));
System.out.println(</span>"东京时间: " +<span style="color: #000000;"> tokyoZonedDateTime.format(formatter));
}</span></pre>
<div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p> </p> <p>六、格式化</p> <p> 示例1: 使用预定义格式解析与格式化日期</p> <div class="cnblogs\_code"><div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #0000ff;"> public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 解析日期</span>
String dateText = "20180924"<span style="color: #000000;">;
LocalDate date </span>=<span style="color: #000000;"> LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(</span>"格式化之后的日期=" +<span style="color: #000000;"> date);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 格式化日期</span>
dateText =<span style="color: #000000;"> date.format(DateTimeFormatter.ISO_DATE);
System.out.println(</span>"dateText=" +<span style="color: #000000;"> dateText);
}</span></pre>
<div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p> </p> <p> 示例2: 日期和字符串的相互转换</p> <div class="cnblogs\_code"><div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String\[\] args) {
DateTimeFormatter formatter </span>= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"<span style="color: #000000;">);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 日期时间转字符串</span>
LocalDateTime now =<span style="color: #000000;"> LocalDateTime.now();
String nowText </span>=<span style="color: #000000;"> now.format(formatter);
System.out.println(</span>"nowText=" +<span style="color: #000000;"> nowText);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 字符串转日期时间</span>
String datetimeText = "1999-12-31 23:59:59"<span style="color: #000000;">;
LocalDateTime datetime </span>=<span style="color: #000000;"> LocalDateTime.parse(datetimeText, formatter);
System.out.println(datetime);
}</span></pre>
<div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p> </p> <p>七、相关类说明</p> <div class="cnblogs\_code"><div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div> <pre><span style="color: #000000;">Instant 时间戳 Duration 持续时间、时间差 LocalDate 只包含日期,比如:</span>2018-09-24<span style="color: #000000;"> LocalTime 只包含时间,比如:</span>10:32:10<span style="color: #000000;"> LocalDateTime 包含日期和时间,比如:</span>2018-09-24 10:32:10<span style="color: #000000;"> Peroid 时间段 ZoneOffset 时区偏移量,比如:</span>+8:00<span style="color: #000000;"> ZonedDateTime 带时区的日期时间 Clock 时钟,可用于获取当前时间戳 java.time.format.DateTimeFormatter 时间格式化类</span></pre> <div class="cnblogs\_code\_toolbar"><span class="cnblogs\_code\_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="https://my.oschina.net//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div> <p> </p>原文地址:https://www.cnblogs.com/ark-blog/p/9694950.html</div>